37

インデックスをリセットせずに MultiIndex の単一レベルでマージする方法はありますか?

ObjectID でインデックス付けされた時間不変値の「静的」テーブルと、ObjectID+Date でインデックス付けされた時間変化フィールドの「動的」テーブルがあります。これらのテーブルを結合したいと思います。

今のところ、私が考えることができる最高のものは次のとおりです。

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True)

ただし、動的テーブルは非常に大きいため、値を結合するためにインデックスをいじる必要はありません。

4

4 に答える 4

27

はい、pandas 0.14.0 以降、.join.

df1.join(df2, how='inner') # how='outer' keeps all records from both data frames

0.14 pandas docsでは、これは同等であると説明されていますが、メモリ効率が高く、次のものよりも高速です。

merge(df1.reset_index(),
      df2.reset_index(),
      on=['index1'],
      how='inner'
     ).set_index(['index1','index2'])

ドキュメント.joinには、1 つのレベルで 2 つのマルチインデックス データフレームをマージするために使用できないことも記載されており、前の問題の GitHub トラッカーの議論から、これは実装する優先事項ではないように思われます。

#6363 を参照してください。マルチマルチ結合を行う方法に関するいくつかのドキュメントとともに。実際に実装するのはかなり複雑です。IMHOは、メモリ使用量/速度をそれほど変更しないため、努力する価値はありません。

ただし、これに関する GitHub の会話があり、最近の開発https://github.com/pydata/pandas/issues/6360がありました。前述のようにインデックスをリセットし、ドキュメントにも記載されているように、これを達成することも可能です。


パンダ >= 0.24.0 の更新

マルチインデックスのデータ フレームを互いに結合できるようになりました。リリースノートによると:

index_left = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'),
                                        ('K1', 'X2')],
                                        names=['key', 'X'])

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']}, index=index_left)

index_right = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
                                        ('K2', 'Y2'), ('K2', 'Y3')],
                                        names=['key', 'Y'])

right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']}, index=index_right)

left.join(right)

外:

            A   B   C   D
key X  Y                 
K0  X0 Y0  A0  B0  C0  D0
    X1 Y0  A1  B1  C0  D0
K1  X2 Y1  A2  B2  C1  D1

[3 rows x 4 columns]
于 2014-03-12T22:31:00.293 に答える
2

単一の列にマッピングを使用します。

df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x])
于 2017-10-26T12:14:31.193 に答える
2

左結合が可能になるように、完全なマルチインデックスを持つようにデータフレームのマージを再インデックス化することで、これを回避します。

# Create the left data frame
import pandas as pd
idx = pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[0,0,1,1],[0,1,0,1]], names=['lvl1','lvl2'])
df = pd.DataFrame([1,2,3,4],index=idx,columns=['data'])

#Create the factor to join to the data 'left data frame'
newFactor = pd.DataFrame(['fact:'+str(x) for x in df.index.levels[0]], index=df.index.levels[0], columns=['newFactor'])

左のデータ フレームのインデックスを含むように newFactor データフレームのインデックスを再作成して、サブインデックスで結合を行います。

df.join(newFactor.reindex(df.index,level=0))
于 2014-01-07T15:57:34.187 に答える