首页 > 解决方案 > 在 Pandas 中,如何选择在一列中有重复但在另一列中有不同值的行?

问题描述

我有一个这样的数据框:

import pandas as pd
records = [{'Name':'John', 'Country':'Canada'}, {'Name':'John', 'Country':'Canada'}, 
       {'Name':'Mary', 'Country':'US'}, {'Name':'Mary', 'Country':'Canada'}, 
       {'Name':'Mary', 'Country':'US'}, {'Name':'Stan', 'Country':'UK'},
       {'Name':'Stan', 'Country':'UK'}]
df = pd.DataFrame(records)
df
Name        Country
0   John    Canada
1   John    Canada
2   Mary    US
3   Mary    Canada
4   Mary    US
5   Stan    UK
6   Stan    UK

我想测试具有不同国家值的名称。在这种情况下,我只想看到 Mary,因为她在国家列中同时包含美国和加拿大。我可以排除 John 和 Stan,因为他们的两个记录都是针对同一个国家/地区的。

任何想法如何做到这一点?

标签: pythonpandasdataframe

解决方案


第一步是找到具有超过 1 个 unique 的名称,Country然后您可以在数据框上使用loc以仅过滤这些值。

方法一:groupby

# groupby name and return a boolean of whether each has more than 1 unique Country
multi_country = df.groupby(["Name"]).Country.nunique().gt(1)

# use loc to only see those values that have `True` in `multi_country`:
df.loc[df.Name.isin(multi_country[multi_country].index)]

   Name Country
2  Mary      US
3  Mary  Canada
4  Mary      US

方法2:drop_duplicatesvalue_counts

您可以遵循相同的逻辑,但使用drop_duplicatesandvalue_counts而不是 groupby:

multi_country = df.drop_duplicates().Name.value_counts().gt(1)

df.loc[df.Name.isin(multi_country[multi_country].index)]

   Name Country
2  Mary      US
3  Mary  Canada
4  Mary      US

方法3:drop_duplicatesduplicated

注意:这会产生略微不同的结果:您只会看到 Mary 的独特价值,这可能是也可能不是...

您可以删除原始帧中的重复项,并仅返回在去重帧中具有多个条目的名称:

no_dups = df.drop_duplicates()

no_dups[no_dups.duplicated(keep = False, subset="Name")]

   Name Country
2  Mary      US
3  Mary  Canada

推荐阅读