value.counts()生成一维表时,怎样让列与列之间的距离增加
时间: 2023-06-17 20:05:47 浏览: 48
`value_counts()`函数是用来计算一维数组中每个唯一值的出现次数的,它不会生成表格。如果你想生成表格并且控制列与列之间的距离,可以使用`pd.crosstab()`函数。在`pd.crosstab()`函数中,你可以使用`margins=True`参数来添加行和列的汇总,在使用`style`属性时,你可以使用`cell_spacing`参数来控制列与列之间的距离。
具体实现可以参考下面的代码:
```python
import pandas as pd
df = pd.DataFrame({
'A': ['a', 'b', 'c', 'a', 'b', 'c'],
'B': ['foo', 'bar', 'foo', 'bar', 'foo', 'foo']
})
table = pd.crosstab(df['A'], df['B'], margins=True)
table.style.set_properties(**{'text-align': 'center'}) \
.set_table_styles([{'selector': 'th', 'props': [('text-align', 'center')]}]) \
.set_cell_spacing(10)
```
这段代码将生成一个带有行和列汇总的交叉表格,并且使用`set_cell_spacing()`方法将列与列之间的距离设置为10个像素。你可以根据需要来调整这个参数的值。
相关问题
请问,用python实现iris数据每一维属性做一个饼图的完整代码
以下是使用Python和matplotlib库实现的Iris数据集每个属性的饼图代码:
```python
import pandas as pd
import matplotlib.pyplot as plt
# 读取iris数据集
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
names=['sepal length', 'sepal width', 'petal length', 'petal width', 'class'])
# 对每个属性进行饼图可视化
for column in df.columns[:-1]:
fig, ax = plt.subplots()
ax.pie(df[column].value_counts(), labels=df[column].unique(), autopct='%1.1f%%')
ax.set_title(column)
plt.show()
```
代码首先使用pandas库读取Iris数据集,并将其存储为DataFrame格式。然后,通过迭代数据框的每个属性,使用matplotlib库中的pie函数生成饼图,并将其显示出来。图例中的百分比使用autopct参数设置。
注意:这里的饼图只适用于统计离散值的分布。如果属性是连续值,应该使用直方图或密度估计图。
import numpy as np import math x = np.array([123,172,76,161,314,77,226,330,202,321,260,155,120,163,221,400,45,106,296,125,210,66,131,242,372]) x.sort() x=5 max_value = x.max() min_value = x.min() m = int(math.ceil((max_value - min_value)/w)) bins = [min_value+k*w for k in range(0, m+1)] x_cuts = pd.cut(x, bins, right=False) number = pd.value_counts(x_cuts) array = number.values rows = number.max() width = np.full([m, rows], 0) size = x.size a = 0 for j in range(0, m): for i in range(0, array[j]): width[j][i] = x[a] a = a + 1 mid_width = np.full([m, rows], 0) for i in range(0, m): for j in range(0, array[i]): mid_width[i][j] = np.median(width[i]) print("\n中值平滑后的等宽箱:") print(mid_width) 输出结果与预期不符。帮我找出问题
您的代码中有几个问题:
1. 在第 6 行,您将 `x` 设置为 5,但这将覆盖原始数据。应该删除此行。
2. 在第 7 行,您将 `max_value` 和 `min_value` 分别设置为 `x.max()` 和 `x.min()`,但这两个值应该是数据的最大值和最小值,而不是排序后的最大值和最小值。应该改为 `max_value = max(x)` 和 `min_value = min(x)`。
3. 在第 10 行,您将 `bins` 列表初始化为 `[min_value k*w for k in range(0, m 1)]`,但这个表达式有语法错误。应该改为 `[min_value + k*w for k in range(0, m+1)]`,这将生成 `m+1` 个边界,最后一个边界是数据的最大值。
4. 在第 12 行,您使用了 `pd.cut` 函数来将数据分成箱子,但您没有导入 Pandas 库。应该添加 `import pandas as pd`。
5. 在第 14 行,您使用了 `pd.value_counts` 函数来计算每个箱子中的数据数量,但此函数返回的是一个 Pandas Series 对象,而不是一个 NumPy 数组。应该使用 `number.values` 将其转换为 NumPy 数组。
6. 在第 17 行,您使用了 `np.full` 函数来创建一个二维 NumPy 数组,但您没有指定数组的数据类型。应该将其改为 `np.full([m, rows], 0, dtype=int)`,这将创建一个整数类型的数组。
7. 在第 19 行,您使用了 `a = a 1` 来递增变量 `a` 的值,但这个语句有语法错误。应该改为 `a = a + 1`。
8. 在第 21 行,您使用了 `np.median` 函数来计算每个箱子的中位数,但您没有指定 `axis` 参数,因此它将计算整个数组的中位数。应该将其改为 `np.median(width[i][:array[i]])`,这将只计算当前箱子中的数据的中位数。
修改后的代码如下:
```
import numpy as np
import pandas as pd
import math
x = np.array([123,172,76,161,314,77,226,330,202,321,260,155,120,163,221,400,45,106,296,125,210,66,131,242,372])
max_value = max(x)
min_value = min(x)
w = 50
m = int(math.ceil((max_value - min_value) / w))
bins = [min_value + k * w for k in range(0, m + 1)]
x_cuts = pd.cut(x, bins, right=False)
number = pd.value_counts(x_cuts)
array = number.values
rows = number.max()
width = np.full([m, rows], 0, dtype=int)
size = x.size
a = 0
for j in range(0, m):
for i in range(0, array[j]):
width[j][i] = x[a]
a = a + 1
mid_width = np.full([m, rows], 0, dtype=int)
for i in range(0, m):
for j in range(0, array[i]):
mid_width[i][j] = np.median(width[i][:array[i]])
print("\n中值平滑后的等宽箱:")
print(mid_width)
```