7

merge(..., how='left')「左」のデータフレームと一致するエントリのみを保持したいので、 を使用して 2 つのデータフレームをマージしています。問題は、マージ操作によって、左端のデータフレームのインデックスが削除されたように見えることです。次に示すのは、次のとおりです。

import pandas
df1 = pandas.DataFrame([{"id": 1,
                         "name": "bob"},
                        {"id": 10,
                         "name": "sally"}])
df1 = df1.set_index("id")
df2 = pandas.DataFrame([{"name": "bob",
                         "age": 10},
                        {"name": "sally",
                         "age": 11}])

print "df1 premerge: "
print df1
df1 = df1.merge(df2, on=["name"],
                how="left")
print "merged: "
print df1
# This is not "id"
print df1.index
# And there's no "id" field
assert ("id" in df1.columns) == False

マージ前は、df1によって索引付けされていましたid。マージ操作の後、マージされたデータフレームのデフォルトの数値インデックスだけがあり、idフィールドは削除されました。この種のマージ操作を行うには、一番左のデータフレームのインデックスを保持するにはどうすればよいですか?

明確にするために: のすべての列を、一致する値を持つdf2すべてのエントリに追加する必要があります。のエントリが にない値を持つ場合、それは にマージされるべきではありません (したがって)。df1iddf2iddf1how='left'

編集:ハックとしてもできます:df1.reset_index()しかし、マージしてからインデックスを再度設定しますが、可能であればそうしないことを好みます。マージでインデックスを削除する必要はないようです。ありがとう。

4

1 に答える 1

4

マージの前に reset_index を実行し、その後に set_index を実行することはすでに指摘されていますが、これは機能します。マージ全体でインデックスを保持するために私が知っている唯一の方法は、マージするデータ フレームの少なくとも 1 つのインデックスをマージに含めることです。ここで、次のことができます。

In [403]: df2 = df2.set_index('name')

In [404]: df1.merge(df2, left_on='name', right_index=True)
Out[404]: 
     name  age
id            
1     bob   10
10  sally   11

「名前」列から取得した df2 のインデックスを、df1 の「名前」列に対してマージします。

そうしないと、結果のデータフレームのインデックスがどちらかのデータフレームから来る可能性があるため、あいまいになるため、これはある程度理にかなっています。

于 2013-05-27T18:19:05.813 に答える