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

如何筛选Pandas DataFrame中ID重复且其他列有差异的所有行

Pandas 筛选存在重复ID且其他列有差异的行

问题描述

现有包含人员唯一ID、姓名、街道、邮箱和日期的Pandas DataFrame,数据存在空值和格式差异,示例数据如下:

ID  Name    Street        Email       Date
1   Paulo   street #1   p@aa.com    2001-01-20
1   Paulo   street #1   p@aa.com    20-Jan
1   Paulo   street #1   p@aa.com    2001-01-20
2   Maria   street #2   m@aa.com    2020-01-01
2   Mari    street #2   m@aa.com    2020-01-01
3   Peter                  xx
4   Josh    street #4   j@aa.com    
4   Josh    street #4   j@aa.com    

需要筛选出满足以下条件的所有行:ID列存在重复,且该ID对应的其他任意列存在不同值,最终保留该ID的所有行,预期输出如下:

ID  Name    Street        Email       Date
1   Paulo   street #1   p@aa.com    2001-01-20
1   Paulo   street #1   p@aa.com    20-Jan
1   Paulo   street #1   p@aa.com    2001-01-20
2   Maria   street #2   m@aa.com    2020-01-01
2   Mari    street #2   m@aa.com    2020-01-01

最优解决方案

核心思路是先定位出符合条件的ID集合,再用该集合过滤原DataFrame,避免重复计算,效率更高。

代码实现

import pandas as pd

# 构造示例DataFrame(空值用pd.NA统一表示)
data = {
    'ID': [1, 1, 1, 2, 2, 3, 4, 4],
    'Name': ['Paulo', 'Paulo', 'Paulo', 'Maria', 'Mari', 'Peter', 'Josh', 'Josh'],
    'Street': ['street #1', 'street #1', 'street #1', 'street #2', 'street #2', pd.NA, 'street #4', 'street #4'],
    'Email': ['p@aa.com', 'p@aa.com', 'p@aa.com', 'm@aa.com', 'm@aa.com', 'xx', 'j@aa.com', 'j@aa.com'],
    'Date': ['2001-01-20', '20-Jan', '2001-01-20', '2020-01-01', '2020-01-01', pd.NA, pd.NA, pd.NA]
}
df = pd.DataFrame(data)

# 1. 筛选出存在列值差异的ID
# 按ID分组后,检查每组内除ID外的列是否有不同值
diff_id_mask = df.groupby('ID').apply(
    lambda group: group.drop('ID', axis=1).nunique().gt(1).any()
)
target_ids = diff_id_mask[diff_id_mask].index

# 2. 用目标ID过滤原DataFrame
result_df = df[df['ID'].isin(target_ids)]

# 输出结果
print(result_df)

代码说明

  • groupby('ID').apply(...):按ID对数据分组,逐组检查列值一致性
  • group.drop('ID', axis=1).nunique():计算每组内除ID外各列的唯一值数量
  • .gt(1).any():判断该组是否存在任意一列的唯一值数量大于1(即存在不同值),只要满足就标记为True
  • diff_id_mask[diff_id_mask].index:提取所有符合条件的ID
  • df[df['ID'].isin(target_ids)]:过滤原DataFrame,保留目标ID的所有行

内容的提问来源于stack exchange,提问作者Paulo Cortez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:05:26