Pandas实现分组值计数(按ID去重统计标签数量)
简洁实现:统计各Label对应的唯一ID数量
嘿,针对你的需求,我整理了几个超简洁的Pandas实现方案,比复杂的自定义逻辑要直观得多!
首先先确认你的数据集:
import pandas as pd r = pd.DataFrame({ 'id': [1, 1, 2, 2, 3], 'value': [4.0, 5.5, 6.0, 4.0, 5], 'label': ["A", "A", "B", "B", "A"], })
你的核心需求是:每个Label对应的不重复ID数量(同一ID在同一Label下只计一次),最终输出字典格式{"A": 2, "B": 1}。下面是几个简便的实现方案:
方案1:最直观的分组统计(推荐)
这是语义最清晰的写法,一步到位:
result = r.groupby('label')['id'].nunique().to_dict() print(result) # 输出: {'A': 2, 'B': 1}
- 逻辑:先按
label分组,对每组的id列统计唯一值的数量,最后转成字典格式,完美匹配需求。
方案2:先去重再计数
如果习惯先处理重复数据再统计,这个写法也很简洁:
result = r[['label', 'id']].drop_duplicates()['label'].value_counts().to_dict() print(result) # 输出: {'A': 2, 'B': 1}
- 逻辑:先提取
label和id列,去掉重复的(Label+ID)组合,再统计每个Label的出现次数,最后转字典。
方案3:链式调用的去重计数
和方案2逻辑一致,但写法更紧凑,可读性也不错:
result = r.drop_duplicates(subset=['label', 'id'])['label'].value_counts().to_dict()
- 这里明确指定
subset=['label', 'id'],让去重的逻辑一目了然。
总结
如果追求代码的可读性和语义清晰,方案1是最优选择;如果习惯先清理重复数据再统计,方案2/3也很合适。这几个方法都比循环或者自定义函数要简便得多~
内容的提问来源于stack exchange,提问作者meto
相关产品推荐
相关产品推荐

