使用Pandas在2个不同大小的数据帧之间查找不同的行

时间:2018-04-12 10:01:20

标签: python pandas for-loop dataframe row

我有2个不同大小的数据帧df1和df2。

df1 = pd.DataFrame({'A':[np.nan, np.nan, np.nan, 'AAA','SSS','DDD'], 'B':[np.nan,np.nan,'ciao',np.nan,np.nan,np.nan]})
df2 = pd.DataFrame({'C':[np.nan, np.nan, np.nan, 'SSS','FFF','KKK','AAA'], 'D':[np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan]})

我的目标是确定df1中出现在df2中的元素。

我能够使用以下代码行来实现我的目标。

df = pd.DataFrame({})
for i, row1 in df1.iterrows():

    found = False
    for j, row2, in df2.iterrows():

        if row1['A']==row2['C']:

            found = True
            print(row1.to_frame().T)

    if found==False and pd.isnull(row1['A'])==False:
        df = pd.concat([df, row1.to_frame().T], axis=0)

df.reset_index(drop=True)

有没有更优雅有效的方法来实现我的目标?

注意:解决方案是

    A   B
0   DDD NaN

1 个答案:

答案 0 :(得分:2)

我认为isin需要boolean indexing

默认链条新条件也省略NaN行:

#changed df2 with no NaN in C column
df2 = pd.DataFrame({'C':[4, 5, 5, 'SSS','FFF','KKK','AAA'], 
                    'D':[np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan]})
print (df2)
     C    D
0    4  NaN
1    5  NaN
2    5  NaN
3  SSS  1.0
4  FFF  NaN
5  KKK  NaN
6  AAA  NaN

df = df1[~(df1['A'].isin(df2['C']) | (df1['A'].isnull()))]
print (df)
     A    B
5  DDD  NaN

如果没有必要,请忽略NaN列,如果C列中不存在:

df = df1[~df1['A'].isin(df2['C'])]
print (df)
     A     B
0  NaN   NaN
1  NaN   NaN
2  NaN  ciao
5  DDD   NaN

如果两列中都存在NaN,请使用第二个解决方案:

(输入DataFrame来自问题)

df = df1[~df1['A'].isin(df2['C'])]
print (df)
     A    B
5  DDD  NaN