如何在排除NaN值列的同时合并两个数据帧?

时间:2017-08-07 14:12:44

标签: python pandas

如果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应忽略列值以执行交集。

3 个答案:

答案 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)