Pandasにおけるデータフレームのマージ操作について解説します。データベース処理にも類似した手法が用いられ、複数のキーカラムをもとにした結合が可能です。
単一キーによるマージ
import pandas as pd
# サンプルデータの作成
df1 = pd.DataFrame({
'id': ['X0', 'X1', 'X2', 'X3'],
'value_a': ['A0', 'A1', 'A2', 'A3'],
'value_b': ['B0', 'B1', 'B2', 'B3']
})
df2 = pd.DataFrame({
'id': ['X0', 'X1', 'X2', 'X3'],
'value_c': ['C0', 'C1', 'C2', 'C3'],
'value_d': ['D0', 'D1', 'D2', 'D3']
})
# idカラムをもとにマージ
merged_df = pd.merge(df1, df2, on='id')
print(merged_df)
複数キーによるマージ
import pandas as pd
# サンプルデータの作成
df1 = pd.DataFrame({
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'value_x': ['X0', 'X1', 'X2', 'X3']
})
df2 = pd.DataFrame({
'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'value_y': ['Y0', 'Y1', 'Y2', 'Y3']
})
# 内部結合
inner_merge = pd.merge(df1, df2, on=['key1', 'key2'], how='inner')
print(inner_merge)
# 外部結合
outer_merge = pd.merge(df1, df2, on=['key1', 'key2'], how='outer')
print(outer_merge)
# 左結合
left_merge = pd.merge(df1, df2, on=['key1', 'key2'], how='left')
print(left_merge)
# 右結合
right_merge = pd.merge(df1, df2, on=['key1', 'key2'], how='right')
print(right_merge)
マージインジケーターの使用
import pandas as pd
# サンプルデータの作成
df_a = pd.DataFrame({
'category': ['A', 'B', 'C'],
'value': [10, 20, 30]
})
df_b = pd.DataFrame({
'category': ['B', 'C', 'D'],
'value': [25, 35, 45]
})
# マージインジケーターを含む結合
merged_with_indicator = pd.merge(
df_a, df_b,
on='category',
how='outer',
indicator='source'
)
print(merged_with_indicator)
インデックスを用いたマージ
import pandas as pd
# インデックス付きデータフレームの作成
df1 = pd.DataFrame({
'score': [80, 90, 75]
}, index=['S001', 'S002', 'S003'])
df2 = pd.DataFrame({
'grade': ['A', 'B', 'C']
}, index=['S001', 'S002', 'S004'])
# インデックスをもとにしたマージ
merged_index = pd.merge(
df1, df2,
left_index=True,
right_index=True,
how='outer'
)
print(merged_index)
重複カラムの解決
import pandas as pd
# 重複カラムを持つデータフレーム
df_students = pd.DataFrame({
'student_id': ['S001', 'S002', 'S003'],
'age': [20, 21, 19]
})
df_enrollment = pd.DataFrame({
'student_id': ['S001', 'S001', 'S004'],
'age': [22, 23, 20]
})
# サフィックスで重複を解決
merged_data = pd.merge(
df_students,
df_enrollment,
on='student_id',
suffixes=('_base', '_enrolled')
)
print(merged_data)