2017-08-07 25 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值。

相關問題