pandas.dataframe上での主要なデータ結合に関して解説します。
データ分析を行う際には各所にデータが存在し、
様々なデータを結合する必要性が出てきますので、
ぜひ覚えていってください!
データ分析を行う際には各所にデータが存在し、
様々なデータを結合する必要性が出てきますので、
ぜひ覚えていってください!
Today's Contents
データ結合とはジョインとも呼ばれ、
“複数のデータソースを共通のキーや軸に基づいて統合する処理”
を指します。
例えば、
・ 顧客情報と購買履歴を「顧客ID」で紐付ける
・ 複数の月次データを縦方向に積み上げる
・異なる属性データを横方向に連結する
これにより、分析に必要なデータを1つの構造にまとめることが可能になります。
“複数のデータソースを共通のキーや軸に基づいて統合する処理”
を指します。
例えば、
・ 顧客情報と購買履歴を「顧客ID」で紐付ける
・ 複数の月次データを縦方向に積み上げる
・異なる属性データを横方向に連結する
これにより、分析に必要なデータを1つの構造にまとめることが可能になります。
【Inner Join:内部結合】
あるキーを軸とし、関連性のある要素のみを抽出する手法です。
顧客マスタとトランザクションデータの2つのデータを顧客IDをキーに結合するとします。
2つのデータで関連性を持っているのは、
顧客IDが「1, 3, 5」のデータのみです。
上記2点をインナージョインすると、
関連性のある「1, 3, 5」の顧客IDのみのデータが作成されます。
【Left Outer Join:左側外部結合】
あるキーを軸とし、左側のデータに対して右側のデータを結合させる手法です。
先ほどのデータを用いて考えてみましょう。
結合結果の行としては、左側のデータ(顧客マスタ)が全件抽出されており、
左側のデータに補足するように、右側のデータ(トランザクションデータ)が付け足されます。
この際に右側のデータの顧客ID6番は左側のデータに存在していないため、
結合結果には表示されません。
またトランザクションデータには顧客ID2番4番のデータがありませんが、
結合結果ではブランク(NULL)として表示されます。
【Right Outer Join:右側外部結合】
あるキーを軸とし、右側のデータに対して左側のデータを結合させる手法です。
イメージとしては、先程のLeft Outer Joinの逆バージョンと考えると良いです。
【Union:軸方向データ統合】
2つのデータを軸方向に統合し、1つのデータを作成する手法です。
2つのトランザクションデータを例にあげて考えましょう。
トランザクション①とトランザクション②は全く別のデータで、
①は購入商品が、②は滞在時間が記録されているデータです。
この2つをユニオンすると合計で4行のデータが作成されます。
結合結果としては、
・同じカラム名が存在する場合は同一カラムとしてデータを結合
・同じカラム名が存在しない場合は単独のカラムとして表示
→データが存在しない部分はNullとして表示
となります。
あるキーを軸とし、関連性のある要素のみを抽出する手法です。
顧客マスタとトランザクションデータの2つのデータを顧客IDをキーに結合するとします。
2つのデータで関連性を持っているのは、
顧客IDが「1, 3, 5」のデータのみです。
上記2点をインナージョインすると、
関連性のある「1, 3, 5」の顧客IDのみのデータが作成されます。
【Left Outer Join:左側外部結合】
あるキーを軸とし、左側のデータに対して右側のデータを結合させる手法です。
先ほどのデータを用いて考えてみましょう。
結合結果の行としては、左側のデータ(顧客マスタ)が全件抽出されており、
左側のデータに補足するように、右側のデータ(トランザクションデータ)が付け足されます。
この際に右側のデータの顧客ID6番は左側のデータに存在していないため、
結合結果には表示されません。
またトランザクションデータには顧客ID2番4番のデータがありませんが、
結合結果ではブランク(NULL)として表示されます。
【Right Outer Join:右側外部結合】
あるキーを軸とし、右側のデータに対して左側のデータを結合させる手法です。
イメージとしては、先程のLeft Outer Joinの逆バージョンと考えると良いです。
【Union:軸方向データ統合】
2つのデータを軸方向に統合し、1つのデータを作成する手法です。
2つのトランザクションデータを例にあげて考えましょう。
トランザクション①とトランザクション②は全く別のデータで、
①は購入商品が、②は滞在時間が記録されているデータです。
この2つをユニオンすると合計で4行のデータが作成されます。
結合結果としては、
・同じカラム名が存在する場合は同一カラムとしてデータを結合
・同じカラム名が存在しない場合は単独のカラムとして表示
→データが存在しない部分はNullとして表示
となります。
実際にpandasで実践してみましょう。
まずは結合のためのデータを事前に作成しましょう。
【方法1: merge(キー結合)】
基本的な構文としては、
です。
実行してみましょう。
【方法2: join(インデックス結合)】
基本的な構文としては、
です。
インデックスでの結合なので、キーを選択する必要がありません。
それでは実行してみましょう。
【方法3: concat(軸方向結合)】
最後にUnionの概念である軸方向結合です。
説明では縦方向を例にお話しましたが、
横方向も可能です。
それでは実行してみましょう。
本日はここまで。
お疲れ様でした!
まずは結合のためのデータを事前に作成しましょう。
import pandas as pd
# 顧客マスタ
df_cus = pd.DataFrame({
'顧客ID': [1, 2, 3, 4, 5],
'顧客名': ['新井', '山田', '小林', '田中', '佐久間']
})
# トランザクションデータ
df_tran = pd.DataFrame({
'顧客ID': [1, 3, 5, 6],
'購入商品': ['パン', '米', '麺', 'シリアル']
})
# トランザクションデータ1
df_tran1 = pd.DataFrame({
'顧客ID': [1, 2],
'顧客名': ['新井', '山田'],
'購入商品': ['パン', '米']
})
# トランザクションデータ2
df_tran2 = pd.DataFrame({
'顧客ID': [1, 2],
'顧客名': ['新井', '山田'],
'滞在': [30, 25]
})
【方法1: merge(キー結合)】
基本的な構文としては、
pd.merge(df1, df2, on=[キー名], how=[結合方法])
です。
実行してみましょう。
# 内部結合(共通データのみ)
pd.merge(df_cus, df_tran, on='顧客ID', how='inner')
# 左結合(左側のデータを全て保持)
pd.merge(df_cus, df_tran, on='顧客ID', how='left')
# 外部結合(全データを保持)
pd.merge(df_cus, df_tran, on='顧客ID', how='outer')
【方法2: join(インデックス結合)】
基本的な構文としては、
df1.join(df2, how=[結合方法])
です。
インデックスでの結合なので、キーを選択する必要がありません。
それでは実行してみましょう。
df_cus_in = df_cus.set_index('顧客ID')
df_tran_in = df_tran.set_index('顧客ID')
df_cus_in.join(df_tran_in, how='left')
【方法3: concat(軸方向結合)】
最後にUnionの概念である軸方向結合です。
説明では縦方向を例にお話しましたが、
横方向も可能です。
それでは実行してみましょう。
# 縦方向に結合(行追加)
pd.concat([df_cus, df_tran], axis=0)
# 横方向に結合(列追加)
pd.concat([df_cus, df_tran], axis=1)
本日はここまで。
お疲れ様でした!
コメント
コメントを投稿