基于多列条件统计并删除行的Pandas实现问题
解决多列组合计数筛选问题
我来帮你搞定这个需求!你想要保留那些v1和v2组合出现恰好2次的行,删除其他组合的数据对吧?你的思路用groupby是对的,但需要用正确的方法把分组计数和原数据关联起来,下面给你两种可行的实现方式:
方法一:用transform生成计数列后筛选
这种方式直观,适合理解分组计数如何映射到每一行:
首先,先把你的测试数据构造出来(方便复现):
import pandas as pd data = { 'ID': [1,1,1,1,1,1,1,1,1], 'v1': [0,15,0,0,0,15,10,10,10], 'v2': [30,10,30,15,20,10,10,10,10] } df = pd.DataFrame(data)
然后执行筛选:
# 给每一行添加它所属(v1,v2)组合的计数 df['group_count'] = df.groupby(['v1', 'v2'])['ID'].transform('count') # 只保留计数为2的行,再删掉临时的计数列 filtered_df = df[df['group_count'] == 2].drop('group_count', axis=1) print(filtered_df)
方法二:用filter直接筛选分组(更简洁)
Pandas的groupby.filter可以直接对分组进行筛选,不需要额外生成临时列:
filtered_df = df.groupby(['v1', 'v2']).filter(lambda group: len(group) == 2)
为什么你的原代码不行?
你之前写的df[df.groupby(['ID', 'v_1', 'v_2'])]有两个问题:
- 列名写错了:你的数据里是
v1和v2,不是v_1、v_2 groupby对象不能直接作为布尔索引传入df[],必须用transform(映射到行)或filter(筛选分组)来转换
最终输出结果
两种方法都会得到你想要的结果:
ID v1 v2 0 1 0 30 2 1 0 30 1 1 15 10 5 1 15 10
内容的提问来源于stack exchange,提问作者Lumos
相关产品推荐
相关产品推荐

