如何用Pandas识别同名但所属国家不同的重复行?
Pandas 筛选符合特定重复条件的行
原始数据
ID FirstName LastName Country 1 Paulo Cortez Brasil 2 Paulo Cortez Brasil 3 Paulo Cortez Espanha 4 Maria Lurdes Espanha 5 Maria Lurdes Espanha 6 John Page USA 7 Felipe Cardoso Brasil 8 John Page USA 9 Felipe Cardoso Espanha 10 Steve Xis UK
需求说明
需要识别出所有满足以下条件的人员的全部记录:
- 名字(FirstName)和姓氏(LastName)完全相同
- 该姓名组合出现多次(记录数≥2)
- 至少有一条记录所属的国家与其他记录不同
最优实现方法
方法一:分组聚合+内连接(逻辑清晰,性能优)
这种方式先通过分组计算关键指标,再筛选目标姓名组合,最后匹配原始数据,适合需要查看中间指标的场景:
import pandas as pd # 构造原始DataFrame data = { 'ID': [1,2,3,4,5,6,7,8,9,10], 'FirstName': ['Paulo','Paulo','Paulo','Maria','Maria','John','Felipe','John','Felipe','Steve'], 'LastName': ['Cortez','Cortez','Cortez','Lurdes','Lurdes','Page','Cardoso','Page','Cardoso','Xis'], 'Country': ['Brasil','Brasil','Espanha','Espanha','Espanha','USA','Brasil','USA','Espanha','UK'] } df = pd.DataFrame(data) # 分组计算每个姓名组合的记录数、唯一国家数 name_stats = df.groupby(['FirstName', 'LastName']).agg( total_records=('ID', 'size'), country_types=('Country', 'nunique') ).reset_index() # 筛选出符合条件的姓名组合 target_names = name_stats[(name_stats['total_records'] > 1) & (name_stats['country_types'] > 1)][['FirstName', 'LastName']] # 匹配原始数据得到结果 result = df.merge(target_names, on=['FirstName', 'LastName'], how='inner') print(result)
方法二:transform生成掩码(代码简洁)
利用transform方法直接在原始DataFrame上生成筛选条件,一步得到结果,代码更紧凑:
import pandas as pd # 构造原始DataFrame(同上) data = { 'ID': [1,2,3,4,5,6,7,8,9,10], 'FirstName': ['Paulo','Paulo','Paulo','Maria','Maria','John','Felipe','John','Felipe','Steve'], 'LastName': ['Cortez','Cortez','Cortez','Lurdes','Lurdes','Page','Cardoso','Page','Cardoso','Xis'], 'Country': ['Brasil','Brasil','Espanha','Espanha','Espanha','USA','Brasil','USA','Espanha','UK'] } df = pd.DataFrame(data) # 生成筛选掩码:同时满足记录数>1、国家种类>1 mask = ( df.groupby(['FirstName', 'LastName'])['Country'].transform(lambda x: x.nunique() > 1) & df.groupby(['FirstName', 'LastName'])['ID'].transform(lambda x: len(x) > 1) ) # 筛选结果 result = df[mask] print(result)
最终结果
ID FirstName LastName Country 0 1 Paulo Cortez Brasil 1 2 Paulo Cortez Brasil 2 3 Paulo Cortez Espanha 3 7 Felipe Cardoso Brasil 4 9 Felipe Cardoso Espanha
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

