如果df1是:
size_a size_b
0 1 2
1 1 5
2 2 3
3 2 9
4 3 1
5 3 5
6 4 4
和df2是:
size_a size_b
0 1 2
1 2 NaN
2 3 NaN
我希望结果为:
size_a size_b
0 1 2
1 2 3
2 2 9
3 3 1
4 3 5
要做交点我只想考虑df2-的非Nan值,其中df2中的NaN应忽略列值以执行交集。
答案 0 :(得分:3)
我认为你可以merge
两次,concat
结果:
一个。正常merge
:
part1 = pd.merge(df1, df2)
湾使用NaN
s:
nans = df2[df2.size_b.isnull()]
part2 = pd.merge(df1, nans[["size_a"]], on="size_a")
℃。 concat
他们
pd.concat([part1, part2], ignore_index=True)
结果:
size_a size_b
0 1 2
1 2 3
2 2 9
3 3 1
4 3 5
答案 1 :(得分:2)
好的一种方法是在第一列上合并使用过滤来消除不匹配的行。
df_out = df1.merge(df2, on='size_a',suffixes=('','_y'))
df_out.query('size_b_y == size_b or size_b_y != size_b_y').drop('size_b_y',axis=1)
输出:
size_a size_b
0 1 2
2 2 3
3 2 9
4 3 1
5 3 5
注意:size_by_y!= size_b_y是检查NaN值的巧妙技巧。
答案 2 :(得分:2)
一种方法是首先通过需要非通配符连接的列进行连接。这将有助于减少您必须构建下游的条件过滤器。在上面的示例中,我看到size_a
是其中一列:
new_df = df1.merge(df2, how='inner', on='size_a')
接下来,您可能希望应用任何其他列匹配的过滤条件,或df2中这些列的值为NaN
的位置。
new_df = new_df[(new_df['size_b_x'] == new_df['size_b_y']) | new_df['size_b_y'].isnull()]
最后,从df2中删除不必要的列(由_y
表示为列名中的后缀)
new_df = new_df.drop('size_b_y', 1)