我有两个DataFrame(下面的示例)。如果df2 [city]是'nan',我想删除df1中任何等于df2 [patnum]的行。
例如:我想删除df1中的行2和3,因为它们包含'4',而df2中的patnum'4'在df2 ['city']中缺少值。
我该怎么做?
df1
Citer Citee
0 1 2
1 2 4
2 3 5
3 4 7
df2
Patnum City
0 1 new york
1 2 amsterdam
2 3 copenhagen
3 4 nan
4 5 sydney
expected result:
df1
Citer Citee
0 1 2
1 3 5
答案 0 :(得分:0)
IIUC stack
isin
和dropna
这个想法是根据匹配返回一个True / False布尔值,然后在我们unstack
数据帧之后删除那些行。
val = df2[df2['City'].isna()]['Patnum'].values
df3 = df1.stack()[~df1.stack().isin(val)].unstack().dropna(how="any")
Citer Citee
0 1.0 2.0
2 3.0 5.0
df1.stack()[~df1.stack().isin(val)]
0 Citer 1
Citee 2
1 Citer 2
2 Citer 3
Citee 5
3 Citee 7
dtype: int64
print(df1.stack()[~df1.stack().isin(val)].unstack())
Citer Citee
0 1.0 2.0
1 2.0 NaN
2 3.0 5.0
3 NaN 7.0