如何在Python Pandas中找出DataFrame重复行中值不同的对应行
问题描述
现有如下Pandas DataFrame,部分ID存在重复:
| ID | COL1 | COL2 | COL3 |
|---|---|---|---|
| 123 | XX | 111 | ENG |
| 123 | abc | 111 | ENG |
| 444 | ccc | 2 | o |
| 444 | ccc | 2 | o |
| 67 | a | 89 | xx |
需要筛选出ID重复且其他列存在值差异的行(类似ID=123的情况),期望输出:
| ID | COL1 | COL2 | COL3 |
|---|---|---|---|
| 123 | XX | 111 | ENG |
| 123 | abc | 111 | ENG |
要求适配多列场景,如何用Python Pandas实现?
解决方案
可以通过以下步骤实现,自动适配任意多列的情况:
步骤1:识别符合条件的ID
按ID分组后,检查每个分组内是否存在列值差异(即分组内任意一列的不同值数量大于1),提取这类ID的列表。
步骤2:筛选目标行
用提取到的ID列表,从原DataFrame中筛选对应行。
具体代码如下:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'ID': [123, 123, 444, 444, 67], 'COL1': ['XX', 'abc', 'ccc', 'ccc', 'a'], 'COL2': [111, 111, 2, 2, 89], 'COL3': ['ENG', 'ENG', 'o', 'o', 'xx'] }) # 获取满足条件的ID:ID重复且分组内存在列值差异 target_ids = df.groupby('ID').filter(lambda group: group.nunique().any() > 1)['ID'].unique() # 筛选目标行 result = df[df['ID'].isin(target_ids)] print(result)
代码解释
groupby('ID').filter(lambda group: group.nunique().any() > 1):对每个ID分组,检查分组内是否有任意一列的不同值数量大于1(即存在差异),保留这类分组。['ID'].unique():提取符合条件的唯一ID列表,避免重复筛选。df[df['ID'].isin(target_ids)]:从原DataFrame中筛选出这些ID对应的所有行。
这种方法无需手动指定列名,会自动检查除ID外的所有列,完美适配多列场景。
内容的提问来源于stack exchange,提问作者unbik
相关产品推荐
相关产品推荐

