2017-01-30 11 views
2

の塗り値との両方の列を出力する2 1Dデータフレームをマージします:私は両方の列が保存されているような方法でそれらをマージしたいパンダ:私は、これら2つのデータフレーム持っているユニークな要素

import pandas as pd 
df1 = pd.DataFrame({'A':[1,2,4,6]}) 
df2 = pd.DataFrame({'A':[1,2,3,6]}) 


df1 
Out[27]: 
    A 
0 1 
1 2 
2 4 
3 6 

df2 
Out[28]: 
    A 
0 1 
1 2 
2 3 
3 6 

を、共通の値が結合されていますそのインデックスを無視し、一意の値がある他、行、でフィル値で保存を取得、私はこの結果にしたい:私は試してみました

A_x A_y 
0 1.0 1.0 
1 2.0 2.0 
2 NaN 3.0 
3 4.0 NaN 
4 6.0 6.0 

pd.merge(df1,df2,on=['A'],how='outer') 
pd.concat([df1,df2],axis=1,join='outer') 

であるが、これらの2つは所望の結果をもたらさない。私はさまざまなオプションでそれらを試してみましたが運がありません。

私はappendassignのような他の方法も検討しましたが、これを行う機能を提供していないようです。

私はこれが簡単な簡単な解決策が必要な一般的な操作であると思うので、明らかに何かを見落とすかもしれません。

あなたはそれが正しく行われた方法を教えてもらえますか? indexで値を連結concat

+1

それはあなたのニーズに合っていないかもしれないが、あなたは重複を比較対照できるように、両方の列を維持したい場合'merge'のための[' indicator'キーワード引数](http://pandas.pydata.org/pandas-docs/version/0.19.1/generated/pandas.DataFrame.merge.html)に興味があるかもしれません。これは、行がマージする前に左、右、または両方の列に存在するかどうかを示す注釈付き列を追加します。 –

+0

それは貴重な情報です、ありがとうございます。 – Khris

答えて

2

ソリューション、そうset_indexが必要です:

df = pd.concat([df1.set_index('A', drop=False).A, 
       df2.set_index('A', drop=False).A], 
       axis=1, 
       keys=('A_x','A_y')).reset_index(drop=True) 
print (df) 
    A_x A_y 
0 1.0 1.0 
1 2.0 2.0 
2 NaN 3.0 
3 4.0 NaN 
4 6.0 6.0 
+0

ありがとう、私は 'set_index()'の使い方について勘違いしていました。 – Khris

2
df2 = df2.set_index('A', drop=False) 
kws = dict(on='A', lsuffix='_x', rsuffix='_y', how='outer') 
df1.join(df2, **kws).drop('A', 1) 

    A_x A_y 
0 1.0 1.0 
1 2.0 2.0 
2 4.0 NaN 
3 6.0 6.0 
3 NaN 3.0 
関連する問題