获得百分比并计算Python

时间:2018-05-04 07:17:28

标签: python pandas percentage pandas-groupby

Suppoose [(123,True), (123, False), ("123",True)](df是一个Pandas数据帧)是一个多索引(日期和名称),变量是用字符串写的类别值,

df.bun

如何使其代表相同日期的总计数及其百分比,以便在每个日期生成如下表格,

date      name             values
20170331  A122630          stock-a
          A123320          stock-a
          A152500          stock-b
          A167860          bond
          A196030          stock-a
          A196220          stock-a
          A204420          stock-a
          A204450          curncy-US
          A204480          raw-material
          A219900          stock-a

我已经date variable counts Percentage 20170331 stock 7 70% bond 1 10% raw-material 1 10% curncy 1 10% 作为这个问题的手段,但它没有...

cf)在获取df.bun之前,我使用以下代码将嵌套字典导入Pandas数据帧。

print(df.groupby('bun').count())

1 个答案:

答案 0 :(得分:1)

我认为需要SeriesGroupBy.value_counts

g = df.groupby('date')['values']
df = pd.concat([g.value_counts(), 
                g.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
print (df)
                       counts  percentage
date     values                          
20170331 stock-a            6        60.0
         bond               1        10.0
         curncy-US          1        10.0
         raw-material       1        10.0
         stock-b            1        10.0

使用size计算的另一个解决方案,然后除以transformSeries创建的新sum

df2 = df.reset_index().groupby(['date', 'values']).size().to_frame('count')
df2['percentage'] = df2['count'].div(df2.groupby('date')['count'].transform('sum')).mul(100)
print (df2)
                       count  percentage
date     values                         
20170331 bond              1        10.0
         curncy-US         1        10.0
         raw-material      1        10.0
         stock-a           6        60.0
         stock-b           1        10.0

解决方案之间的差异首先按每组的值排序,然后按第二排序MultiIndex排序。