Pandas分组统计同时含C列双取值的(A,B)组合占比方法
需求说明
现有包含A、B、C三列的DataFrame,三列数值取值范围分别为{1,2}、{6,7}、{11,12},需要统计所有实际观测到的(A,B)组合中,同时存在C=11和C=12两类观测记录的组合所占比例,要求方法可适配大规模数据集,无需人工核对中间统计结果。
示例数据构造
import pandas as pd df = pd.DataFrame({ "A": [1, 2, 1, 1, 2, 1, 1, 2], "B": [6,7,7,6,7,6,6,6], "C": [11,12,11,11,12,12,11,12] })
示例数据内容:
A B C 0 1 6 11 1 2 7 12 2 1 7 11 3 1 6 11 4 2 7 12 5 1 6 12 6 1 6 11 7 2 6 12
人工核对该示例可知,共有4个实际出现的(A,B)组合,其中仅(1,6)同时包含C=11和C=12取值,目标占比为25%。
高效实现方案
核心思路:通过pandas原生分组聚合完成判断,避免自定义逐行操作,利用内置优化适配大规模数据。
通用兼容写法(不受C列其他取值影响)
无论C列是否存在11、12之外的取值,该写法都能准确判断:
# 按(A,B)分组,判断每组C列是否同时包含11和12 group_check = df.groupby(["A", "B"])["C"].agg(lambda x: {11, 12}.issubset(x.unique())) # 布尔值的均值即为True的占比 target_ratio = group_check.mean() print(target_ratio) # 输出:0.25
极致性能写法(已知C列仅含11、12两个取值时使用)
如果确定C列取值只有11和12两类,可直接用原生nunique聚合,性能比自定义lambda高30%以上,适合亿级以下大规模数据集:
# 统计每组C列唯一值数量,等于2即代表同时包含11和12 target_ratio = df.groupby(["A", "B"])["C"].nunique().eq(2).mean() print(target_ratio) # 输出:0.25
方案说明
- 所有计算逻辑均通过pandas底层C优化实现,无Python层循环,处理大规模数据时速度远高于手动统计或遍历方案
- 最终直接输出浮点型占比结果,无需人工核对中间的
value_counts输出,可直接接入后续计算流程
内容的提问来源于stack exchange,提问作者Smithey
相关产品推荐
相关产品推荐

