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())
答案 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
计算的另一个解决方案,然后除以transform
和Series
创建的新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
排序。