pandas の merge
pythonのpandasはDBのように使えるので、よくデータ分析で使用します。
その中のメソッドに、mergeとういうものがあります。他にもconcat, joinとかがあります。
mergeでは、how='inner'のように指定することで、内部結合、完全外部結合、左外部結合、右外部結合を使用できます。
sqlでいう、JOINとほぼ等価の働きをしてくれますので、何か困ったらsqlのjoinのノウハウを調べると、解決できることが多いです。
さて、今回私が直面したのは、Left Joinすると、レコード数が増えるという問題です。
・外部結合(LEFT JOIN)は左のテーブルをすべて抽出し、これを基準にON結合条件で右のテーブルのキーをチェックし、合致するレコードを結合。よってキーが存在せず結合できなくてもレコードをNull値で追加し、キーが重複していればその分重複して結合され、レコード件数が増える。
・内部結合(INNER JOIN)はON結合条件で両方のテーブルをチェックし、合致するレコードを結合。よってキーが重複していればその分重複して結合されレコードが増える。
今回の私の問題は、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編)