我有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
我相信需要isin有boolean indexing:
isin
boolean indexing
NaN默认情况下也忽略s行链接新条件:
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列中不存在:
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来自问题)
DataFrame
df = df1[~df1['A'].isin(df2['C'])] print (df) A B 5 DDD NaN