我想在pandas DataFrame中计算统计信息(观察值的百分比)。
我有以下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
答案 0 :(得分:1)
首先,您想重新调整数据。如您所说,您将需要分组,因此您需要首先将数据分组到一个列中。我为此使用pd.melt。
然后,使用pd.cut,从称为bin
的bin列表中,将值所属的categories
分配到新列中。如果要使用名称代替实际的bin值,只需用labels
部分取消注释代码即可。
然后,按bins
分组并使用Series.value_counts
,我可以算出每组中的箱数。
如果您确实要按照问题中的要求输出,请使用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