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)

異なる列名での結合

実例

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)

結合タイプ

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

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 メソッド

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)

複数テーブルの結合

実例

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)

実践:複数テーブルの関連付け

実例

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)

merge vs join の選択

比較 merge join
結合の基準 列 インデックス
デフォルトの結合 inner left
適用シナリオ 業務キーでの結合 主キー/インデックスでの結合

ほとんどの場合、merge の方が柔軟で、join はインデックス結合時に簡潔です。実際のデータ構造に応じて適切な方法を選択してください。

その他の拡張