我有一个这样的数据框:
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,因为他们的记录来自同一个国家。
任何想法如何实现这一点?
第一步是找到具有 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_duplicates
和value_counts
您可以遵循相同的逻辑,但使用drop_duplicates
andvalue_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_duplicates
和duplicated
注意:这将给出略有不同的结果:您只会看到 Mary 的唯一值,这可能是也可能不是需要的...
您可以删除原始帧中的重复项,并仅返回在去重帧中具有多个条目的名称:
no_dups = df.drop_duplicates()
no_dups[no_dups.duplicated(keep = False, subset="Name")]
Name Country
2 Mary US
3 Mary Canada
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句