如何按间隔分隔数据框列并绘制
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]
- 手动对数据框进行分箱,groupby 分箱,并生成条形图
- 使用
pandas.cut
创建一个带 bin 的新列。
# 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()
- 使用
pandas.DataFrame.plot.hist
or matplotlib.pyplot.hist 通过定义 bin 边缘绘制直方图
- matplotlib: Histograms
# 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*stdev
和 2*stdev
之间分布在 20 个柱中的所有数据。
我有一个如下所示的数据框:
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]
- 手动对数据框进行分箱,groupby 分箱,并生成条形图
- 使用
pandas.cut
创建一个带 bin 的新列。
# 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()
- 使用
pandas.DataFrame.plot.hist
or matplotlib.pyplot.hist 通过定义 bin 边缘绘制直方图
- matplotlib: Histograms
# 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*stdev
和 2*stdev
之间分布在 20 个柱中的所有数据。