Pandas データ結合(merge / join)
Pandas は強力なデータ結合機能を提供しており、SQL のようにキーに基づいて2つ以上の DataFrame を結合できます。mergeとjoin最もよく使われる2つのメソッドです。
merge 基本の使い方
pd.merge()関数は、2つの DataFrame を列に基づいて結合するために使用され、SQL の JOIN 操作に似ています。
単純な結合
実例
import pandas as pd
# 2つの DataFrame を作成
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"氏名": ["张三", "李四", "王五"]
})
df2 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"数学": [85, 92, 78]
})
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# 結合
result = pd.merge(df1, df2, on="学生番号")
print("結合結果:")
print(result)
# 2つの DataFrame を作成
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"氏名": ["张三", "李四", "王五"]
})
df2 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"数学": [85, 92, 78]
})
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# 結合
result = pd.merge(df1, df2, on="学生番号")
print("結合結果:")
print(result)
異なる列名での結合
実例
import pandas as pd
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"氏名": ["张三", "李四", "王五"]
})
df2 = pd.DataFrame({
"student_id": ["S001", "S002", "S003"],
"数学": [85, 92, 78]
})
# left_on と right_on を使用
result = pd.merge(df1, df2, left_on="学生番号", right_on="student_id")
print("異なる列名での結合:")
print(result)
print()
# 余分な列を削除
result = result.drop("student_id", axis=1)
print("余分な列を削除した後:")
print(result)
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003"],
"氏名": ["张三", "李四", "王五"]
})
df2 = pd.DataFrame({
"student_id": ["S001", "S002", "S003"],
"数学": [85, 92, 78]
})
# left_on と right_on を使用
result = pd.merge(df1, df2, left_on="学生番号", right_on="student_id")
print("異なる列名での結合:")
print(result)
print()
# 余分な列を削除
result = result.drop("student_id", axis=1)
print("余分な列を削除した後:")
print(result)
結合タイプ
inner / left / right / outer
実例
import pandas as pd
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003", "S004"],
"氏名": ["张三", "李四", "王五", "赵六"]
})
df2 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003", "S005"],
"数学": [85, 92, 78, 88]
})
print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()
# inner join(デフォルト):両方にあるものだけを保持
print("inner join(交差):")
print(pd.merge(df1, df2, on="学生番号", how="inner"))
print()
# left join:左のテーブルのすべての行を保持
print("left join(左のテーブルを保持):")
print(pd.merge(df1, df2, on="学生番号", how="left"))
print()
# right join:右のテーブルのすべての行を保持
print("right join(右のテーブルを保持):")
print(pd.merge(df1, df2, on="学生番号", how="right"))
print()
# outer join:すべての行を保持
print(outer join(和集合):)
print(pd.merge(df1, df2, on="学生番号", how="outer"))
df1 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003", "S004"],
"氏名": ["张三", "李四", "王五", "赵六"]
})
df2 = pd.DataFrame({
"学生番号": ["S001", "S002", "S003", "S005"],
"数学": [85, 92, 78, 88]
})
print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()
# inner join(デフォルト):両方にあるものだけを保持
print("inner join(交差):")
print(pd.merge(df1, df2, on="学生番号", how="inner"))
print()
# left join:左のテーブルのすべての行を保持
print("left join(左のテーブルを保持):")
print(pd.merge(df1, df2, on="学生番号", how="left"))
print()
# right join:右のテーブルのすべての行を保持
print("right join(右のテーブルを保持):")
print(pd.merge(df1, df2, on="学生番号", how="right"))
print()
# outer join:すべての行を保持
print(outer join(和集合):)
print(pd.merge(df1, df2, on="学生番号", how="outer"))
4つの JOIN の違いを理解することが重要です:inner は交差を保持、left は左のテーブルの全部を保持、right は右のテーブルの全部を保持、outer は両方のテーブルの全部を保持します。
複数キーでの結合
実例
import pandas as pd
df1 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"売上高": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"利益": [20, 25, 18, 22]
})
# 複数キーでの結合
result = pd.merge(df1, df2, on=["都市", "年"])
print("複数キーでの結合:")
print(result)
join メソッド
実例
import pandas as pd
df1 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"売上高": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"利益": [20, 25, 18, 22]
})
# 複数キーでの結合
result = pd.merge(df1, df2, on=["都市", "年"])
print("複数キーでの結合:")
print(result)
df1 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"売上高": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"都市": ["北京", "北京", "上海", "上海"],
"年": [2023, 2024, 2023, 2024],
"利益": [20, 25, 18, 22]
})
# 複数キーでの結合
result = pd.merge(df1, df2, on=["都市", "年"])
print("複数キーでの結合:")
print(result)
DataFrame.join()これはもう1つの結合方法で、デフォルトは左結合で、インデックスに基づいて結合します。
インデックスでの結合
実例
import pandas as pd
# データを作成し、インデックスを設定
df1 = pd.DataFrame({
"氏名": ["张三", "李四", "王五"],
"年齢": [25, 30, 28]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"数学": [85, 92, 78],
"英語": [90, 88, 95]
}, index=["S001", "S002", "S003"])
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# join を使用して結合
result = df1.join(df2)
print("join 結合:")
print(result)
# データを作成し、インデックスを設定
df1 = pd.DataFrame({
"氏名": ["张三", "李四", "王五"],
"年齢": [25, 30, 28]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"数学": [85, 92, 78],
"英語": [90, 88, 95]
}, index=["S001", "S002", "S003"])
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# join を使用して結合
result = df1.join(df2)
print("join 結合:")
print(result)
複数テーブルの結合
実例
import pandas as pd
df1 = pd.DataFrame({
"氏名": ["张三", "李四", "王五"]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"数学": [85, 92, 78]
}, index=["S001", "S002", "S004"])
df3 = pd.DataFrame({
"英語": [90, 88, 95]
}, index=["S001", "S003", "S004"])
# チェーン join
result = df1.join(df2, how="left").join(df3, how="left")
print("複数テーブル join(左結合):")
print(result)
print()
# outer を使用
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("複数テーブル join(完全外部結合):")
print(result2)
df1 = pd.DataFrame({
"氏名": ["张三", "李四", "王五"]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"数学": [85, 92, 78]
}, index=["S001", "S002", "S004"])
df3 = pd.DataFrame({
"英語": [90, 88, 95]
}, index=["S001", "S003", "S004"])
# チェーン join
result = df1.join(df2, how="left").join(df3, how="left")
print("複数テーブル join(左結合):")
print(result)
print()
# outer を使用
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("複数テーブル join(完全外部結合):")
print(result2)
実践:複数テーブルの関連付け
実例
import pandas as pd
# ビジネスデータをシミュレート
# 1. 従業員テーブル
employees = pd.DataFrame({
"従業員ID": ["E001", "E002", "E003", "E004"],
"氏名": ["张三", "李四", "王五", "赵六"],
"部署ID": ["D001", "D001", "D002", "D003"]
})
# 2. 部署テーブル
departments = pd.DataFrame({
"部署ID": ["D001", "D002", "D003"],
"部署名": ["技術部", "営業部", "運営部"]
})
# 3. 給与テーブル
salaries = pd.DataFrame({
"従業員ID": ["E001", "E002", "E003", "E004"],
"給与": [12000, 15000, 11000, 18000]
})
print("ステップ1:従業員と部署を結合")
result = pd.merge(employees, departments, on="部署ID")
print(result)
print()
print("ステップ2:次に給与と結合")
result = pd.merge(result, salaries, on="従業員ID")
print(result)
# ビジネスデータをシミュレート
# 1. 従業員テーブル
employees = pd.DataFrame({
"従業員ID": ["E001", "E002", "E003", "E004"],
"氏名": ["张三", "李四", "王五", "赵六"],
"部署ID": ["D001", "D001", "D002", "D003"]
})
# 2. 部署テーブル
departments = pd.DataFrame({
"部署ID": ["D001", "D002", "D003"],
"部署名": ["技術部", "営業部", "運営部"]
})
# 3. 給与テーブル
salaries = pd.DataFrame({
"従業員ID": ["E001", "E002", "E003", "E004"],
"給与": [12000, 15000, 11000, 18000]
})
print("ステップ1:従業員と部署を結合")
result = pd.merge(employees, departments, on="部署ID")
print(result)
print()
print("ステップ2:次に給与と結合")
result = pd.merge(result, salaries, on="従業員ID")
print(result)
merge vs join の選択
| 比較 | merge | join |
|---|---|---|
| 結合の基準 | 列 | インデックス |
| デフォルトの結合 | inner | left |
| 適用シナリオ | 業務キーでの結合 | 主キー/インデックスでの結合 |
その他の拡張ほとんどの場合、merge の方が柔軟で、join はインデックス結合時に簡潔です。実際のデータ構造に応じて適切な方法を選択してください。