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ステートメントの実行に関する限り、私が間違っていることを知る手がかりがありません。
どんな助けも大歓迎です。
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_id
やstar_restaurant_review
のようなことをしたい場合は、次のことができます。
pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))
パラメーターの詳細は、この link で説明されています。
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']
を使用できます。
誰かが(別の列ではなく)インデックス上で2つのデータフレームを一緒にマージしようとする必要がある場合、これも機能します!
T1とT2は同じインデックスを持つデータフレームです
import pandas as pd
T1 = pd.merge(T1, T2, on=T1.index, how='outer')
追伸appendはNaNを不必要に埋めるため、マージを使用する必要がありました。