2017-08-07 68 views
4

如果DF1是:如何在排除NaN值列的同时合并两个数据框?

 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 

做我想做只考虑非NaN值的交集的df2-凡在df2中存在NaN的列值应该被忽略以执行相交。

+0

删除不必要的列(S)如果要排除'NaN',不应结果是只有一行,两个df的size_a = 1和size_b = 2?或者,您是否打算将'NaN'视为通配符,并将该列的任何值加入到df1中,其中''NaN'在df2中被观察到? –

+0

我想NaN被视为通配符,在实际问题中我有七个coulmns。 – javed

回答

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) 
+0

此解决方案更具可读性并可扩展至多个专栏@ Scratch'N'Purr谢谢.. – javed

3

我认为你可以merge他们两次与concat结果:

一个。普通merge

part1 = pd.merge(df1, df2) 

b。合并行子集NaN s:

nans = df2[df2.size_b.isnull()] 
part2 = pd.merge(df1, nans[["size_a"]], on="size_a") 

c。 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 
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值。

相关问题