计算沿列的摘要统计信息

时间:2019-08-12 09:29:25

标签: python pandas group-by

我想在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

1 个答案:

答案 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