python - Python Pandas - 如何查找列值与两个数据框不同的行
问题描述
我正在尝试获取列中的值与两个数据框不同的行。
例如,假设我们有以下两个数据框:
import pandas as pd
data1 = {'date' : [20210701, 20210704, 20210703, 20210705, 20210705],
'name': ['Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
'a' : [1,0,1,1,0]}
data2 = {'date' : [20210701, 20210702, 20210704, 20210703, 20210705, 20210705],
'name': ['Dave', 'Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
'a' : [1,0,1,1,0,0]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
如您所见,Dave 在 20210704 的“a”列中具有不同的值,而 Sue 在 020210705 的“a”列中具有不同的值。因此,我希望的输出应该类似于:
import pandas as pd
output = {'date' : [20210704, 20210705],
'name': ['Dave', 'Sue'],
'a_from_old' : [0,1]}
df_output = pd.DataFrame(output)
minus statement
如果我没记错的话,除非我遗漏了一些边缘情况,否则我所要求的内容与 SQL 中的内容几乎相同。
如何在列中找到日期和名称相同但值不同的行?
更新
我发现了一个极端情况,即某些数据甚至不在另一个数据框中,我想找到两个数据框中的数据,但“a”列中的值不同。
我编辑了样本数据集以考虑边缘情况。(请注意,20210702 上的 Dave 不会出现在最终输出中,因为数据不在第一个数据帧中)。
解决方案
尝试merge()
使用indicator=True
然后过滤结果,query()
然后删除额外的列drop()
并使用以下方法将“a”重命名为“a_from_old” rename()
:
out=(df1.merge(df2,on=['date','name','a'],how='left',indicator=True)
.query("_merge=='left_only'").drop('_merge',1)
.rename(columns={'a':'a_from_old'}))
输出out
:
date name a_from_old
2 20210704 Dave 0
4 20210705 Sue 1
注意:如果您要重命名更多列,请通过:
suffixes=('_from_old', '')
在merge()
方法中作为参数
推荐阅读
- python - 使 DataFrame 相对于特定列保持平衡
- java - Spring MockWebServiceServer 处理多个异步请求
- azure - Azure SQL API 是否支持 xml 查询?
- maven - (误报)使用 gitlab-ci 运行 docker-compose:构建作业失败但管道成功
- java - JTable排序器对整数和双精度排序不正确
- excel - VBA复选框取消选中事件和多个范围加载到列表框
- python - 在 Tkinter 文件对话框中选择文件后出现“不本地化”警告
- types - 尝试将常规浮点值添加到具有浮点的类型
. F# - mongodb - 单个成员副本集可以吗?
- python - 如何在Python中提取括号之间的值