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

如何在Pandas中保留按ID1分组后ID2重复出现的行?

按分组筛选重复值行的解决方案

问题描述

原始DataFrame如下:

ID 1          ID 2
1             5
1             5
1             6
2             7
2             5
2             7
3             8
3             9
3             10

需求:按ID 1分组后,保留每个分组内ID 2出现次数大于1的所有行。

已尝试代码:

df_temp = df.groupby('ID 1')
df_output = df_temp['ID 2'].value_counts()[df_temp['ID 2'].value_counts() > 1]

得到的中间结果:

ID 1          ID 2
1             5         2
2             7         2

需要基于这个中间结果,筛选原始DataFrame得到目标结果:

ID 1          ID 2
1             5
1             5
2             7
2             7

解决方法

方法一:利用已生成的df_output筛选

df_output是多层索引的Series,先将其转换为包含ID 1和ID 2的筛选表,再匹配原始数据:

# 将中间结果转为筛选用DataFrame
filter_df = df_output.reset_index()[['ID 1', 'ID 2']]
# 内连接匹配原始数据
result = df.merge(filter_df, on=['ID 1', 'ID 2'], how='inner')

或者用元组匹配的方式:

# 获取需要保留的(ID1, ID2)组合
keep_pairs = df_output.index.to_list()
# 逐行判断是否在保留组合内
result = df[df.apply(lambda row: (row['ID 1'], row['ID 2']) in keep_pairs, axis=1)]

方法二:直接用transform一步完成(更高效)

无需生成中间结果,直接在分组内计算ID 2的出现次数并筛选:

# 按ID1+ID2分组,计算每个组合的出现次数,筛选次数>1的行
result = df[df.groupby(['ID 1', 'ID 2'])['ID 2'].transform('size') > 1]

以上两种方法均可得到目标结果,其中方法二代码更简洁,执行效率也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:02