![](/img/trans.png)
[英]Python Pandas Identify Duplicated rows with Additional Column
[英]Identify duplicated rows with different value in another column pandas dataframe
假设我有一个 dataframe 的名字和国家:
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
我需要一种方法来识别所有具有相同名字和姓氏且在 dataframe 中出现不止一次但至少有一个记录似乎属于另一个国家并返回所有重复行的人。 这样就产生了这个 dataframe:
ID FirstName LastName Country
1 Paulo Cortez Brasil
2 Paulo Cortez Brasil
3 Paulo Cortez Espanha
7 Felipe Cardoso Brasil
9 Felipe Cardoso Espanha
实现它的最佳方法是什么?
一个可能的解决方案,基于DataFrameGroupBy.filter
:
(df.groupby(['FirstName', 'LastName'])
.filter(lambda x: x['Country'].nunique() > 1)
.reset_index(drop=True))
Output:
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
使用 boolean 索引:
# is the name present in several countries?
m = df.groupby(['FirstName', 'LastName'])['Country'].transform('nunique').gt(1)
out = df.loc[m]
Output:
ID FirstName LastName Country
0 1 Paulo Cortez Brasil
1 2 Paulo Cortez Brasil
2 3 Paulo Cortez Espanha
6 7 Felipe Cardoso Brasil
8 9 Felipe Cardoso Espanha
首先从您的 pandas dataframe 中删除重复项:
df = df.drop_duplicates()
按FirstName
和LastName
分组以计算给定的名字和姓氏对与不同国家相关联的次数:
new_df = df.groupby(['FirstName', 'LastName']).size().reset_index(name='counts')
然后只保留计数大于 1 的行:
new_df=new_df[new_df.counts > 1]
然后,您可以将初始df
与FirstName
和LastName
上的new_df
合并:
pd.merge(df, new_df, on=['FirstName', 'LastName'])
这将返回:
FirstName LastName Country counts
0 Paulo Cortez Brasil 3
1 Paulo Cortez Brasil 3
2 Paulo Cortez Espanha 3
3 Felipe Cardoso Brasil 2
4 Felipe Cardoso Espanha 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.