如何筛选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(即存在不同值),只要满足就标记为Truediff_id_mask[diff_id_mask].index:提取所有符合条件的IDdf[df['ID'].isin(target_ids)]:过滤原DataFrame,保留目标ID的所有行
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

