Pandas按Data1、Data2分组 仅统计State为On的Data3唯一值计数
解决方案实现
核心逻辑
你的需求本质是:
- 分组维度仅保留
Data1、Data2两个字段 - 分组内的统计规则:仅筛选
State == 'On'的条目,计算这些条目中Data3的去重值数量 - 计算结果需要回填到分组下的每一行,不管行本身的State取值是什么
正确代码实现
写法1(简洁高效,适合常规统计)
import pandas as pd df = pd.DataFrame({'Data1' : ['A', 'A', 'A', 'B', 'B', 'B'], 'Data2' : [100, 100, 200, 100, 100, 100], 'Data3' : [1, 2, 3, 1, 1, 1], 'State' : ['On', 'On', 'Off', 'Off', 'On', 'On']}) # 对非On状态的行,将Data3值置为NaN masked_col = df['Data3'].where(df['State'] == 'On') # 按要求分组,自动跳过NaN做唯一值计数 df['Count'] = masked_col.groupby([df['Data1'], df['Data2']]).transform('nunique')
- 实现原理:pandas的
nunique方法会自动忽略空值,刚好对应“仅统计State为On条目”的规则,不需要额外写过滤分支 - 执行效率高,对百万行级别的大表性能表现远好于逐行自定义逻辑
写法2(灵活可扩展,适合复杂统计)
如果后续统计逻辑需要调整,可以用自定义函数的形式实现:
df['Count'] = df.groupby(['Data1', 'Data2'])['Data3'].transform( lambda group_series: group_series[df.loc[group_series.index, 'State'] == 'On'].nunique() )
结果校验
代码执行后输出的DataFrame和你预期的结果完全一致:
| Data1 | Data2 | Data3 | State | Count |
|---|---|---|---|---|
| A | 100 | 1 | On | 2 |
| A | 100 | 2 | On | 2 |
| A | 200 | 3 | Off | 0 |
| B | 100 | 1 | Off | 1 |
| B | 100 | 1 | On | 1 |
| B | 100 | 1 | On | 1 |
原代码问题说明
你之前写的代码错误将State纳入分组键,相当于把同组内State不同的行拆成独立分组计算nunique,完全偏离了“按Data1、Data2划分大组、组内仅统计On条目”的逻辑。
内容的提问来源于stack exchange,提问作者mike_gundy123
相关产品推荐
相关产品推荐

