python - 在 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,因为他们的两个记录都是针对同一个国家/地区的。
任何想法如何做到这一点?
解决方案
第一步是找到具有超过 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
推荐阅读
- postgresql - 单元测试代码:= 运行时错误:无效的内存地址或 nil 指针取消引用
- java - 如何在事务开始之前或提交之前执行操作?
- java - 在设备上或从底栏按下返回按钮时,不会调用 onBackPressed
- sql - 如何在 SQL 的列中随机分配一组值?
- php - 如何显示 PHP 内部 web 服务器的介绍文本
- xamarin - 有关从 Xamarin Forms 应用程序获取用户评论的方式的任何建议。可能使用 appcenter.ms 的东西?
- reactjs - 我必须根据页面的位置重定向页面。我可以知道哪种方法是最佳实践吗
- qt - qwebp.dll 中的 Qt 5.13.2.0 可能的恶意软件 Variant.Adware.Kazy.795337
- javascript - 如何将水平滚动添加到g标签下的svg子元素
- python - 如何在 Jupyter 中导入 researchpy?