pandas の merge

pythonのpandasはDBのように使えるので、よくデータ分析で使用します。

 

その中のメソッドに、mergeとういうものがあります。他にもconcat, joinとかがあります。

mergeでは、how='inner'のように指定することで、内部結合、完全外部結合、左外部結合、右外部結合を使用できます。

 

sqlでいう、JOINとほぼ等価の働きをしてくれますので、何か困ったらsqlのjoinのノウハウを調べると、解決できることが多いです。

 

さて、今回私が直面したのは、Left Joinすると、レコード数が増えるという問題です。

 

・外部結合(LEFT JOIN)は左のテーブルをすべて抽出し、これを基準にON結合条件で右のテーブルのキーをチェックし、合致するレコードを結合。よってキーが存在せず結合できなくてもレコードをNull値で追加し、キーが重複していればその分重複して結合され、レコード件数が増える。
・内部結合(INNER JOIN)はON結合条件で両方のテーブルをチェックし、合致するレコードを結合。よってキーが重複していればその分重複して結合されレコードが増える。

SQLによる外部結合と内部結合

 

今回の私の問題は、req_dfに重複があることが問題です。下記のようなコードになります。

order_df_with_req = pd.merge(order_df, req_df, how='left', left_on='shop', right_on='req')
len(order_df) # 1000
len(order_df_with_req) #1200

 

従って、キーとなるカラムの重複を消します。

    req_df = req_dff.groupby('req').agg({'day': lambda x: ','.join(x)})
req_df = req_df.reset_index()

これで解決すると思います。SQLより簡単ですね。

ここがとても参考になります。 pandasの使い方(merge、join、concat編)