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

发布于 2021-01-29 15:02:32

我有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中 没有 出现的元素。

通过使用以下代码行,我能够实现自己的目标。

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
关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我相信需要isinboolean indexing

    NaN默认情况下也忽略s行链接新条件:

    #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两个列中都存在,则使用第二个解决方案:

    (输入DataFrames来自问题)

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看