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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:25:26