我有两个不同大小的 Pandas 数据框(它们都至少有 500,000 行)。为简单起见,您可以将它们称为 df1
和 df2
。我有兴趣查找 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/