检查另一个

时间:2018-02-20 16:55:54

标签: python pandas dataframe

我有两个不同大小的Pandas数据帧(两者中至少有500,000行)。为简单起见,您可以将其称为df1df2。我有兴趣找到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

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

2 个答案:

答案 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