如何用Pandas内置函数计算列值的占比/分位数并保存至新列?
如何用Pandas内置函数计算DataFrame中列值的占比?
我有一个包含两列的DataFrame:
df hr count 2 53 3 1586 4 890 5 833 6 209我想计算count列中每个值的占比/分位数,并将结果保存到新列中。目前我使用的方法是:
df['avg'] = (df['count'] / df['count'].sum()) * 100执行后得到:
df hr count avg 2 53 1.484178 3 1586 44.413330 4 890 24.922991 5 833 23.326799 6 209 5.852702我希望使用mean()这类Pandas内置函数来实现该需求,请问该如何操作?
其实你要的是计算相对频率(每个值在总和中的占比),先澄清一下:mean()本身是用来计算列的平均值,和占比逻辑不直接相关,不过我们可以用Pandas更优雅的内置方法来实现你的需求,替代手动写除法的方式:
方法一:用div() + mul()链式调用
这是和你原有逻辑完全一致的Pandas内置方法写法,代码更简洁易读:
df['avg'] = df['count'].div(df['count'].sum()).mul(100)
div()是Pandas的除法方法,mul()是乘法方法,链式调用后和你手动计算(count / sum) * 100的结果完全相同。
方法二:结合transform()适配复杂场景
如果后续你的DataFrame需要分组计算占比,transform()能保证计算结果和原DataFrame维度匹配,同样适用于当前场景:
df['avg'] = df['count'].div(df['count'].transform('sum')).mul(100)
比如当你按hr分组时,transform('sum')会返回每个组的总和并对应到组内每一行,而不是全局总和,这个方法扩展性更强。
关于mean()的补充说明
mean()计算的是列的平均值,和占比逻辑没有直接关联——毕竟sum(count) = len(df) * mean(count)只有当所有count值相等时才成立,所以它并不能直接用来计算占比。上面的div()+sum()组合才是Pandas中实现占比的标准内置方法。
内容的提问来源于stack exchange,提问作者Ali Hasan
相关产品推荐
相关产品推荐

