我有两个不同大小的Pandas数据帧(两者中至少有500,000行)。为简单起见,您可以将其称为df1
和df2
。我有兴趣找到df1
中不存在的df2
行。任何数据帧都不必是另一个的子集。此外,行的顺序无关紧要。
例如,i
中的df1
观察可能是j
中的df2
观察,我需要将其视为存在(订单赢了&t; t物)。另一个重要的事情是两个数据帧都可能包含空值(因此操作也必须适用于此)。
两个数据框的一个简单例子是
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
但这假设一个数据帧是另一个数据帧的子集,在我的情况下不一定是真的。
答案 0 :(得分:2)
这是一种方式:
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
。
答案 1 :(得分:1)
这是解决方案
pd.concat([df1,df2.loc[df2.col1.isin(df1.col1)]],keys=[1,2]).drop_duplicates(keep=False).loc[1]
Out[892]:
col1 col2
0 1 10.0
1 2 11.0