You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:57:37