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

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和你预期的结果完全一致:

Data1Data2Data3StateCount
A1001On2
A1002On2
A2003Off0
B1001Off1
B1001On1
B1001On1

原代码问题说明

你之前写的代码错误将State纳入分组键,相当于把同组内State不同的行拆成独立分组计算nunique,完全偏离了“按Data1、Data2划分大组、组内仅统计On条目”的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 14:36:03