在Pandas pivot_table中添加总百分比列
我似乎搞不清楚怎么在下面的pandas透视表中,为每个提交日期的分组添加一个总数的百分比列:
In [177]: pass_rate_pivot
date_submitted audit_status
04-11-2014 audited 140
is_adserver 7
rejected 75
unauditable 257
04-18-2014 audited 177
is_adserver 10
pending 44
rejected 30
unauditable 226
04-25-2014 audited 97
is_adserver 5
pending 33
rejected 9
unauditable 355
Name: site_domain, dtype: int64
In [177]: pass_rate_pivot.to_dict()
Out[177]:
{('04-11-2014', 'audited'): 140,
('04-11-2014', 'is_adserver'): 7,
('04-11-2014', 'rejected'): 75,
('04-11-2014', 'unauditable'): 257,
('04-18-2014', 'audited'): 177,
('04-18-2014', 'is_adserver'): 10,
('04-18-2014', 'pending'): 44,
('04-18-2014', 'rejected'): 30,
('04-18-2014', 'unauditable'): 226,
('04-25-2014', 'audited'): 97,
('04-25-2014', 'is_adserver'): 5,
('04-25-2014', 'pending'): 33,
('04-25-2014', 'rejected'): 9,
('04-25-2014', 'unauditable'): 355}
2 个回答
0
最简单的方法就是在创建数据透视表的时候直接处理。在这里,我假设你有一个叫做 date_submitted 的列(它不是索引的一部分),可以使用 reset_index
。同时,要确保你的数值在一个列里(我这里称这个列为 'value_col')。然后
def calc_group_pct(df,value_var = 'value_col'):
df['pct'] = df[value_var]/float(df[value_var].sum())
return df
df.groupby('date_submitted').apply(calc_group_pct)
3
这就是你想要的结果吗?(对于每个组,将该组内所有元素的和进行划分):
In [62]: pass_rate_pivot.groupby(level=0).transform(lambda x: x/x.sum())
Out[62]:
04-11-2014 audited 0.292276
is_adserver 0.014614
rejected 0.156576
unauditable 0.536534
04-18-2014 audited 0.363450
is_adserver 0.020534
pending 0.090349
rejected 0.061602
unauditable 0.464066
04-25-2014 audited 0.194389
is_adserver 0.010020
pending 0.066132
rejected 0.018036
unauditable 0.711423
dtype: float64
如果你想把这个作为一列添加进去,确实可以像@exp1orer建议的那样,把两个系列合并成一个数据框:
pd.concat([pass_rate_pivot,pass_rate_pivot_pct], axis=1)
如果pass_rate_pivot
已经是一个数据框,你可以直接像这样添加一列:pass_rate_pivot['pct'] = pass_rate_pivot['原始列'].groupby(...