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

基于多列条件统计并删除行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:14