web-dev-qa-db-ja.com

インデックスのデータフレームをpandasでマージする

2つのデータフレームがあり、それぞれに2つのインデックス列があります。それらをマージしたいと思います。たとえば、最初のデータフレームは次のとおりです。

                   V1

A      1/1/2012    12
       2/1/2012    14
B      1/1/2012    15
       2/1/2012    8
C      1/1/2012    17
       2/1/2012    9

2番目のデータフレームは次のとおりです。

                   V2

A      1/1/2012    15
       3/1/2012    21             
B      1/1/2012    24
       2/1/2012    9
D      1/1/2012    7
       2/1/2012    16

その結果、次のものを取得したいと思います。

                   V1   V2

A      1/1/2012    12   15
       2/1/2012    14   N/A
       3/1/2012    N/A  21           
B      1/1/2012    15   24
       2/1/2012    8    9
C      1/1/2012    7    N/A
       2/1/2012    16   N/A
D      1/1/2012    N/A  7
       2/1/2012    N/A  16

pd.mergeおよび.joinメソッドを使用していくつかのバージョンを試しましたが、何も機能しないようです。何か提案はありますか?

54
km1234

joinを使用できるはずです。これは、デフォルトでインデックスに結合します。希望する結果が得られたら、outerを結合タイプとして使用する必要があります。

>>> df1.join(df2, how='outer')
            V1  V2
A 1/1/2012  12  15
  2/1/2012  14 NaN
  3/1/2012 NaN  21
B 1/1/2012  15  24
  2/1/2012   8   9
C 1/1/2012  17 NaN
  2/1/2012   9 NaN
D 1/1/2012 NaN   7
  2/1/2012 NaN  16

署名:_.join(other、on = None、how = 'left'、lsuffix = ''、rsuffix = ''、sort = False)Docstring:インデックスまたはキー列のいずれかで列を他のDataFrameと結合します。リストを渡すことにより、複数のDataFrameオブジェクトをインデックスで効率的に結合します。

73
Alexander

merge でこれを行うことができます:

df_merged = df1.merge(df2, how='outer', left_index=True, right_index=True)

キーワード引数how='outer'は両方のフレームのすべてのインデックスを保持し、欠落しているインデックスをNaNで埋めます。 left_indexおよびright_indexキーワード引数では、インデックスに対してマージが実行されます。マージを実行した後に列内のNaNをすべて取得する場合、別のトラブルシューティング手順は、インデックスのdtypesが同じであることを確認することです。

上記のmergeコードは、次の出力を生成します。

                V1    V2
A 2012-01-01  12.0  15.0
  2012-02-01  14.0   NaN
  2012-03-01   NaN  21.0
B 2012-01-01  15.0  24.0
  2012-02-01   8.0   9.0
C 2012-01-01  17.0   NaN
  2012-02-01   9.0   NaN
D 2012-01-01   NaN   7.0
  2012-02-01   NaN  16.0
41
root