176

DataFrames2つをマージし、最初のフレームのインデックスをマージされたデータセットのインデックスとして保持したいと思います。ただし、マージを実行すると、結果のDataFrameには整数インデックスがあります。左側のデータフレームのインデックスを保持するように指定するにはどうすればよいですか?

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
                          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
                          'to_merge_on': {0: 1, 1: 3, 2: 5}})

In [6]: a
Out[6]:
   col1  to_merge_on
a     1            1
b     2            3
c     3            4

In [7]: b
Out[7]:
   col2  to_merge_on
0     1            1
1     2            3
2     3            5

In [8]: a.merge(b, how='left')
Out[8]:
   col1  to_merge_on  col2
0     1            1   1.0
1     2            3   2.0
2     3            4   NaN

In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')

編集:簡単に再現できるサンプルコードに切り替えました

4

7 に答える 7

222
In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
       col1  to_merge_on  col2
index
a         1            1     1
b         2            3     2
c         3            4   NaN

一部の左マージ操作では、との間にa複数の一致がある場合よりも多くの行が表示される可能性があることに注意してください。この場合、重複を削除する必要があるかもしれません。ab

于 2012-08-16T07:53:01.620 に答える
15

左側のデータフレームにインデックスのコピーを作成して、マージすることができます。

a['copy_index'] = a.index
a.merge(b, how='left')

この単純な方法は、大きなデータフレームで作業し、pd.merge_asof()(またはdd.merge_asof())を使用するときに非常に便利であることがわかりました。

このアプローチは、インデックスのリセットにコストがかかる場合(データフレームが大きい場合)に優れています。

于 2019-07-27T21:12:54.507 に答える
9

とを使用した非pd.mergeソリューションがSeries.mapありDataFrame.set_indexます。

In: a['col2'] = a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
In: a['col2']
Out:
   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

indexこれは、インデックスのダミー名を導入しません。

ただし、DataFrame.mapメソッドがないため、このアプローチは複数の列には適用されないことに注意してください。

于 2017-09-11T17:33:14.380 に答える
7
df1 = df1.merge(df2, how="inner", left_index=True, right_index=True)

これにより、df1のインデックスを保持できます。

于 2019-04-26T06:43:10.910 に答える
2

結果のdfの行数と順序が最初のdfと同じであると仮定すると、次のように実行できます。

c = pd.merge(a, b, on='to_merge_on')
c.set_index(a.index,inplace=True)
于 2021-09-24T07:49:57.100 に答える
1

もう1つの簡単なオプションは、インデックスの名前を以前の名前に変更することです。

a.merge(b, how="left").set_axis(a.index)

マージはデータフレーム'a'での順序を保持しますが、インデックスをリセットするだけなので、set_axisを使用するために保存されます

于 2020-05-04T07:37:13.513 に答える
0

私は別の解決策を思いついたと思います。左側のテーブルをインデックス値で結合し、右側のテーブルを左側のテーブルのインデックスに基づく列値で結合していました。私がしたことは通常のマージでした:

First10ReviewsJoined = pd.merge(First10Reviews, df, left_index=True, right_on='Line Number')

次に、マージされたテーブルから新しいインデックス番号を取得し、SentimentLineNumberという名前の新しい列に配置しました。

First10ReviewsJoined['Sentiment Line Number']= First10ReviewsJoined.index.tolist()

次に、行番号(左側のテーブルインデックスから結合した列の値)と呼ばれる既存の列に基づいて、インデックスを元の左側のテーブルインデックスに手動で戻します。

First10ReviewsJoined.set_index('Line Number', inplace=True)

次に、行番号のインデックス名を削除して、空白のままにします。

First10ReviewsJoined.index.name = None

ちょっとしたハックかもしれませんが、うまく機能し、比較的単純なようです。また、データの重複/混乱のリスクが軽減されると思います。うまくいけば、それはすべて理にかなっています。

于 2020-01-24T19:11:59.367 に答える