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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:31:08