我想在 Pandas DataFrame 中计算统计数据(某个百分位范围内的观察计数)。
我有以下数据帧
Austria Japan USA
0.8 0.1 0.4
0.5 0.8 0.3
0.4 0.5 0.8
0.1 0.1 0.7
0.3 0.9 0.9
我想达到以下结果。
非常感谢帮助
Count(PERCENTILE(x<0.4)) Count(PERCENTILE(0.4<x<0.7)) Count(PERCENTILE(x>0.7))
Austria
Japan
USA
首先,您要重新调整数据。正如您所说,您需要分组,因此您需要先将数据分组为一列。我为此使用pd.melt。
然后,使用pd.cut,我将从bin
名为 的 bin 列表中分配该值所属的新列categories
。如果您想使用名称而不是实际的 bins 值,只需取消对该labels
部分代码的注释。
然后,通过分组bins
和使用Series.value_counts
,我可以计算出每组的 bin 数量。
如果您真的想要问题中提出的输出,请使用 df.unstack()
df = pd.read_csv('some_data.csv')
df = pd.melt(df, var_name='country', value_name='value')
print(df)
# country value
# 0 Austria 0.8
# 1 Austria 0.5
# 2 Austria 0.4
# 3 Austria 0.1
# 4 Austria 0.3
# 5 Japan 0.1
# 6 Japan 0.8
# 7 Japan 0.5
# 8 Japan 0.1
# 9 Japan 0.9
# 10 USA 0.4
# 11 USA 0.3
# 12 USA 0.8
# 13 USA 0.7
# 14 USA 0.9
categories = [0.0, 0.4, 0.7, 1.0]
# labels = ['Count(Percentile(x<0.4))', 'Count(Percentile(0.4<x<0.7))', 'Count(Percentile(0.7<x))']
df['bins'] = pd.cut(df['value'], categories)#, labels=labels)
print(df)
# country value bins
# 0 Austria 0.8 (0.7, 1.0]
# 1 Austria 0.5 (0.4, 0.7]
# 2 Austria 0.4 (0.0, 0.4]
# 3 Austria 0.1 (0.0, 0.4]
# 4 Austria 0.3 (0.0, 0.4]
# 5 Japan 0.1 (0.0, 0.4]
# 6 Japan 0.8 (0.7, 1.0]
# 7 Japan 0.5 (0.4, 0.7]
# 8 Japan 0.1 (0.0, 0.4]
# 9 Japan 0.9 (0.7, 1.0]
# 10 USA 0.4 (0.0, 0.4]
# 11 USA 0.3 (0.0, 0.4]
# 12 USA 0.8 (0.7, 1.0]
# 13 USA 0.7 (0.4, 0.7]
# 14 USA 0.9 (0.7, 1.0]
df = df.groupby(['country'])['bins'].value_counts()
print(df)
# country bins
# Austria (0.0, 0.4] 3
# (0.4, 0.7] 1
# (0.7, 1.0] 1
# Japan (0.0, 0.4] 2
# (0.7, 1.0] 2
# (0.4, 0.7] 1
# USA (0.0, 0.4] 2
# (0.7, 1.0] 2
# (0.4, 0.7] 1
print(df.unstack())
# bins (0.0, 0.4] (0.4, 0.7] (0.7, 1.0]
# country
# Austria 3 1 1
# Japan 2 1 2
# USA 2 1 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句