LoginSignup
1
1

More than 1 year has passed since last update.

データの結合 - concatかmergeか

Posted at

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

出力結果はこちら。
image.png

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

出力結果はこちら。
image.png

mergeしたdf_storeの'store_name'が一番右側に結合されています。

mergeのコードの型
pd.merge('データフレーム1', 'データフレーム2'.how='結合方法',on='軸となる変数')

mergeの結合方法について

how=の後で結合方法を指定しますが、4つの方法があります。
inner:内部結合
left:左結合
right:右結合
outer:完全外部結合

ここで説明すると長くなりそうなので、mergeの結合方法 について別途投稿したいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1