concatかmergeか
共通のカラムを持つデータフレーム同士を結合する場合に、concatやmergeが使われます。
どういう場面でconcatを使って、mergeを使うのはどういう場面なのでしょうか。
・mergeは共通の変数(カラム)を持つデータフレーム同士を結合する
・2つのファイル(データフレーム)と結合する時はmerge
・同じ列名同士で横につなげたい時はconcat
題材
データサイエンティスト協会が出している100本ノック - 構造化データ加工編を題材に使用します。
実例 - concat
19問目を使ってconcatの実例を示します。
問題
レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出し表示せよ。
項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。
なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。
本題に入る前にdf_receiptを呼び出して、変数名や中身を見てみましょう。
df_receipt = pd.read_csv('皆さんの保存場所/receipt.csv')
df_receipt.head()
"sales_ymd"から"amount"まで9つの変数があることがわかります。問題文によると"amount"の順位を作って、"customer_id"、"amount"、"amount"の順位で表示させることを求めています。
同一データフレーム内の必要な項目を抽出してつなぎ合わせる時にconcatを使います。
df_tmp = pd.concat([df_receipt[['customer_id','amount']],df_receipt['amount'].rank(method='min', ascending=False)], axis=1)
df_tmp.columns = ['customer_id', 'amount', 'ranking']
df_tmp.head(10)
concatのコードの型
pd.concat('変数1', '変数2', ..., '変数n', axis=1)
並べたい順に変数名を記述します。
axisについて
axis=1
と書く事で、横方向にデータが連結されます。書かないとaxis=0
として実行されて、縦方向にデータが連結されます。
実例 - merge
36問目を使ってmergeの実例を示します。
問題
レシート明細データフレーム(df_receipt)の全項目と店舗データフレーム(df_store)の店舗名(store_name)が出力されるように、レシート明細データフレームと店舗データフレームを内部結合し、結合後のデータを10件表示せよ。
df_receiptとdf_storeの二つのデータフレームを結合させるので、mergeを使います。
mergeをするには結合したいデータフレームそれぞれに共通した変数があることが必要です。それを軸に結合します。
df_receiptとdf_storeのそれぞれの変数を調べてみます。
print('df_receiptの変数名')
print(df_receipt.columns)
print()
print("df_storeの変数名")
print (df_store.columns)
df_receiptの変数名
Index(['sales_ymd', 'sales_epoch', 'store_cd', 'receipt_no', 'receipt_sub_no',
'customer_id', 'product_cd', 'quantity', 'amount'],
dtype='object')
df_storeの変数名
Index(['store_cd', 'store_name', 'prefecture_cd', 'prefecture', 'address',
'address_kana', 'tel_no', 'longitude', 'latitude', 'floor_area'],
dtype='object')
という結果を得られます。mergeの対象は
・df_receiptの全項目
・df_storeの'store_name'のみ
です。そしてそれぞれのデータフレームで共通して使われている変数を軸とします。それが'store_cd'です。
注意しなければならないのは、mergeされるdf_storeの抽出対象変数に軸となる'store_cd'を含める事です。
mergeを次のコードで実行します。
pd.merge(df_receipt,df_store[['store_cd','store_name']].how='inner', on='store_cd').head(10)
mergeしたdf_storeの'store_name'が一番右側に結合されています。
mergeのコードの型
pd.merge('データフレーム1', 'データフレーム2'.how='結合方法',on='軸となる変数')
mergeの結合方法について
how=の後で結合方法を指定しますが、4つの方法があります。
inner:内部結合
left:左結合
right:右結合
outer:完全外部結合
ここで説明すると長くなりそうなので、mergeの結合方法 について別途投稿したいと思います。