python - 检查另一个中存在哪些行的 pandas

标签 python pandas dataframe

我有两个不同大小的 Pandas 数据框(它们都至少有 500,000 行)。为简单起见,您可以将它们称为 df1df2 。我有兴趣查找 df1 中不存在于 df2 中的行。任何数据帧都不必是另一个数据帧的子集。此外,行的顺序并不重要。

例如,df1 中的第 i 观察结果可能是 df2 中的第 j 观察结果,我需要认为它存在(顺序无关紧要)。另一件重要的事情是两个数据帧都可能包含空值(因此该操作也必须适用于该情况)。

两个数据框的一个简单示例是

df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 100], 'col2' : [10, 11, NaN, 50}) 

df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 100], 'col2' : [20, 21, NaN, 13, 14, 50]})

在这种情况下,解决方案是

df3 = pandas.DataFrame(data = {'col1' : [1, 2 ], 'col2' : [10, 11]})

请注意,实际上,两个数据框都有 15 列(完全相同的列名称,完全相同的数据类型)。另外,我在 Windows 7 上的 Jupyter Notebook 上使用 Python 2.7。我使用了内置函数 df1.isin(df2) 的 Pandas,但它没有提供我想要的准确结果。

而且,我还看到了this question

但这假设一个数据帧是另一个数据帧的子集,这在我的情况下不一定成立。

最佳答案

这是一种方法:

import pandas as pd, numpy as np

df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 100], 'col2' : [10, 11, np.nan, 50]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 100], 'col2' : [20, 21, np.nan, 13, 14, 50]})

x = set(map(tuple, df1.fillna(-1).values)) - set(map(tuple, df2.fillna(-1).values))
# {(1.0, 10.0), (2.0, 11.0)}

pd.DataFrame(list(x), columns=['col1', 'col2'])

如果结果中有 np.nan 数据,它将显示为 -1,但您可以轻松转换回来。假设您的基础数据中不会有负数[如果有,请替换为一些不可能的值]。

复杂化的原因是 np.nan == np.nan 被认为是 False

关于python - 检查另一个中存在哪些行的 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48890385/

相关文章:

python - 如何解析改变格式的德国日期?

python - 从现有的日期列创建新列 "Week"

R:选择高于某个阈值的 n 个连续行中的第一个

python - 在 Python 中取消融化 Pandas 数据框?

r - 将 data.frame 拆分为矩阵并将对角线元素相乘以生成新列

python - 获取keras中所有已知vgg-16类的列表

python - 如何使用文件中的随机代理/UA 制作 annonimizer?

python - 如何使用 Python/Pandas 在 Excel 中插入新行(带条件)

python - 如何使用 Tkinter 在 python 脚本中存储图像?

python - 排序二维列表python