如何按间隔分隔数据框列并绘制

How to separate a dataframe column by intervals, and plot

我有一个如下所示的数据框:

     Edades
0        -15.612896
1        -18.612896
2         11.387104
3        -12.612896
4         17.387104
            ...
566597    15.387104
566598     5.387104
566599     6.387104
566600     0.387104
566601    22.387104

我想制作一个条形图,显示按标准差的倍数定义的间隔分类的数据的频率。到目前为止,我知道 plt.hist() 实际上可以做类似的事情,但它不允许我在范围内使用浮点类型值。

我试过的代码如下:

plt.figure("Edad_Distrib")
plt.hist(nuevo_edad, range(-100,100))
plt.xlabel("Edades")
plt.ylabel("Frecuencia")
plt.title("Distrib edades")
plt.show()

我怎样才能在这样的范围内绘制一些东西?

plt.hist(nuevo_edad, range(-2*stdev,2*stdev))

如果它有任何用途,我有我的教授在 R 中所做的这段代码,它与随机生成的数据帧完全相同,我只是不知道如何在 python 和我的特定数据帧中实现它.

A <- rnorm(100)
m <- mean(A)
s <- var(A)
k <- -11

x = seq(-5, 5, length = k)
y = vector("numeric", length = (k-1))

for (i in 1:(k-1)){
       y[i] = sum(A>x[i] & A<x[i+1])

}

barplot(y)

  • 定义 bin 边缘,df.a.mean() ± df.a.std() * value
    • 以下代码中的 list-comprehension 创建了 bin 边缘列表。
  • 使用 pandas.Series.mean
  • 获取数据帧的平均值
  • pandas.Series.std
  • 得到均值的标准差
import pandas as pd
import numpy as np  # for sample data
import matplotlib.pyplot as plt

# create sample dataframe
np.random.seed(365)
data = {'a': [np.random.randint(700) for _ in range(3000)]}
df = pd.DataFrame(data)

# create the bin edges
bins = [df.a.mean() + (df.a.std() * v) for v in range(-5, 6, 1)]

print(bins)
[-652.44, -451.49, -250.55, -49.6, 151.35, 352.3, 553.25, 754.19, 955.14, 1156.09, 1357.04]
# create a column of bins
df['bins'] = pd.cut(df.a, bins=bins)

# groupby the bins and plot
df.groupby('bins')['a'].count().plot.bar()

# matplotlib plot
plt.hist(x=df.a, bins=bins)
plt.ylabel('Frequency')
plt.show()

# or dataframe plot
df.a.plot.hist(bins=bins)
plt.show()

如果您想定义一个范围,您最常将它作为 keyword argument (kwarg) 传递给函数,在本例中为 range。它将是这样的:

plt.hist(nuevo_edad, range=(-2*stdev,2*stdev))

请注意,您不传递集合(如 range(a, b)),hist 中的参数 range 是两个元素的元组。

PS:这只会影响你想要绘制的数据。如果您不是指直方图中需要多少条柱,则使用参数 bins.

示例:

plt.hist(nuevo_edad, bins=20, range=(-2*stdev,2*stdev))

这将绘制 -2*stdev2*stdev 之间分布在 20 个柱中的所有数据。