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

如何用更高效的Pandas GroupBy方法计算分组后各列1的占比

更高效的Pandas分组计算1占比的技巧

嘿,你的思路方向是对的,但确实有更简洁高效的写法!因为你的列里只有0和1,计算1的占比其实等价于求该列的均值——毕竟均值就是总和除以总数,正好对应1的个数除以组内总条数。

最优实现:直接用mean()方法

这是最简洁且性能最好的方式,一步就能得到结果,不用像之前那样分两次做groupby然后除法:

import pandas as pd

# 你的原始数据
i1 = ["AA", "AA", "AA", "BB", "BB", "BB"]
i2 = ["B1", "B1", "B1", "A1", "A1", "A1"]
col1 = [1, 1, 1, 0, 1, 0]
col2 = [0, 0, 0, 1, 1, 0]
col3 = [1, 1, 0, 0, 0, 0]
df = pd.DataFrame({"I1": i1, "I2": i2, "Col_1":col1, "Col_2":col2, "Col_3":col3})

# 优化后的代码
result = df.groupby(["I1", "I2"])[["Col_1", "Col_2", "Col_3"]].mean()
print(result)

运行后输出的结果完全符合你的需求:

Col_1    Col_2     Col_3
I1 I2                            
AA B1  1.000000  0.000000  0.666667
BB A1  0.333333  0.666667  0.000000

为什么这个方法比你的原始写法更好?

  • 代码更简洁:省去了手动计算sum()和count()再做除法的步骤,一行代码搞定
  • 性能更优:你的原始代码需要执行两次groupby操作,而mean()只需要一次分组,减少了内存占用和计算时间,数据量越大,差异越明显
  • 可读性更强:看到mean()就能立刻明白这是在计算占比,逻辑一目了然,其他开发者看代码也不会困惑

额外小提示

如果你的列里以后出现了0和1之外的值,想要统计某个特定值的占比,也可以用类似的思路:

# 比如统计Col_1中等于2的占比(假设列里有2)
result = df.groupby(["I1", "I2"])["Col_1"].apply(lambda x: (x == 2).mean())

本质还是利用布尔值转成0/1后求均值的逻辑,非常实用。

内容的提问来源于stack exchange,提问作者Jash Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:05