web-dev-qa-db-ja.com

2つのpandasデータフレームを結合(共通の列で結合)

2つのデータフレームがあります。

restaurant_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)

Pandasの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)

私はpandasが初めてであり、joinステートメントの実行に関する限り、私が間違っていることを知る手がかりがありません。

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

63
anonuser0428

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

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

ここで、onは、結合する両方のデータフレームに存在するフィールド名を指定し、how「両方のフレームからのキーの結合(SQL:完全外部結合)」を使用して、外部との内部/外部/左/右結合を定義します。両方のデータフレームに「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'))

パラメーターの詳細は、この link で説明されています。

93
mlimb

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

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']を使用できます。

18
Dan Allan

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

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

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

追伸appendはNaNを不必要に埋めるため、マージを使用する必要がありました。

11
Firas