代码之家  ›  专栏  ›  技术社区  ›  Federico Gentile

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

  •  1
  • Federico Gentile  · 技术社区  · 6 年前

    我有两个不同大小的数据帧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 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    我相信需要 isin 具有 boolean 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
    

    如无必要,省略 南安 如果不存在,则为 C 列:

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

    如果存在 南安 两列中的使用第二种解决方案:

    (输入 DataFrame s来自问题)

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