2つのパンダデータフレームを結合します(共通の列に参加します)


83

私は2つのデータフレームを持っています:

レストラン_ids_dataframe

Data columns (total 13 columns):
business_id      4503  non-null values
categories       4503  non-null values
city             4503  non-null values
full_address     4503  non-null values
latitude         4503  non-null values
longitude        4503  non-null values
name             4503  non-null values
neighborhoods    4503  non-null values
open             4503  non-null values
review_count     4503  non-null values
stars            4503  non-null values
state            4503  non-null values
type             4503  non-null values
dtypes: bool(1), float64(3), int64(1), object(8)`

そして

Restaurant_review_frame

Int64Index: 158430 entries, 0 to 229905
Data columns (total 8 columns):
business_id    158430  non-null values
date           158430  non-null values
review_id      158430  non-null values
stars          158430  non-null values
text           158430  non-null values
type           158430  non-null values
user_id        158430  non-null values
votes          158430  non-null values
dtypes: int64(1), object(7)

パンダでDataFrame.join()コマンドを使用して、これら2つのDataFrameを結合して単一のデータフレームにしたいと思います。

次のコード行を試しました。

#the following line of code creates a left join of restaurant_ids_frame and   restaurant_review_frame on the column 'business_id'
restaurant_review_frame.join(other=restaurant_ids_dataframe,on='business_id',how='left')

しかし、これを試してみると、次のエラーが発生します。

Exception: columns overlap: Index([business_id, stars, type], dtype=object)

私はパンダに非常に慣れていないので、joinステートメントの実行に関する限り、何が間違っているのかわかりません。

どんな助けでも大歓迎です。


一般的なパンダのマージに関する関連するより広範なトピック:パンダのマージ101
cs95

回答:


118

マージを使用て、2つのデータフレームを1つに結合できます。

import pandas as pd
pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer')

ここで、onは、結合する両方のデータフレームに存在するフィールド名を指定し、 その内側/外側/左/右結合かどうかをどのように定義するかを指定します。両方のデータフレームに「star」列があるため、これにより、デフォルトで、結合されたデータフレームにstar_xとstar_yの2つの列が作成されます。@DanAllanがjoinメソッドについて述べたように、マージのサフィックスをkwargとして渡すことで変更できます。デフォルトはsuffixes=('_x', '_y')です。あなたのような何かをしたい場合star_restaurant_idstar_restaurant_review、あなたが行うことができます。

 pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))

パラメータについては、このリンクで詳しく説明されています。


1
あなたのアドバイスは私の問題を解決しました。私がしなければならなかった唯一の変更は、外側ではなく内側のマージを行ったことです。つまり、outerではなくhow = 'inner'です。ご協力いただきありがとうございます。
anonuser0428 2013

2
how = inner | outside | left | right、マージ方法、キーの左と右の共通部分| union(ALL)キーの左と右|左のキーのみ|右のキーのみ|
gaoithe 2015年

21

DataFrameに共通の列名がある場合、結合は失敗します。それを回避する最も簡単な方法は、次のようなlsuffixorrsuffixキーワードを含めることです。

restaurant_review_frame.join(restaurant_ids_dataframe, on='business_id', how='left', lsuffix="_review")

このように、列には異なる名前が付けられます。ドキュメントはこの問題に対処しています

または、参加する前に問題のある列を削除するだけで、これを回避できます。たとえば、の星restaurant_ids_dataframeがの星と重複している場合はrestaurant_review_frame、次のようになりdel restaurant_ids_dataframe['stars']ます。


また、「business_id」列がオーバーラップしていると表示されますが、これは結合を作成している列なので、オーバーラップするはずではありませんか?その問題にどのように対処しますか?
anonuser0428 2013

@DanAllanさん、joinメソッドを試しましたが、restaurant_ids_dataframeに4503エントリ、restaurant_review_frameに属する列に0エントリしかありません。なぜこれが起こっているのか教えていただけますか?上記のステートメントを使用して提案したように、左結合を実行しましたが、何らかの理由で、restaurant_review_frameからのアイテムが表示されないようです。私が探しているのは、business_idで結合された、両方のデータフレームのすべての列を含むデータフレームを作成することです。business_id以外の余分な列も削除しました。
anonuser0428 2013

それでもこれを解決することに興味がある場合は、データが問題を再現している例を提供してください。
ダン・アラン

16

誰かが(別の列ではなく)インデックスで2つのデータフレームをマージしようとする必要がある場合、これも機能します!

T1とT2は、同じインデックスを持つデータフレームです。

import pandas as pd
T1 = pd.merge(T1, T2, on=T1.index, how='outer')

PS追加するとNaNが不必要に埋められるため、マージを使用する必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.