pandas でデータフレームを結合する方法には merge と concat があります。merge が列の値をキーにした横方向の結合であるのに対し、concat は単純にデータフレームを縦や横に連結します。
縦方向の連結
複数のデータフレームを縦に積み重ねるには、concat にリストで渡します。
import pandas as pd
df1 = pd.DataFrame({
'name': ['Alice', 'Bob'],
'score': [80, 90]
})
df2 = pd.DataFrame({
'name': ['Charlie', 'Dave'],
'score': [70, 85]
})
result = pd.concat([df1, df2])
print(result)
このコードを実行すると、df1 の下に df2 が連結された 4 行のデータフレームができます。デフォルトでは元のインデックスがそのまま保持されるため、インデックスが重複することがあります。
インデックスをリセットする
連結後にインデックスを振り直したい場合は、ignore_index=True を指定します。
result = pd.concat([df1, df2], ignore_index=True)
これで 0, 1, 2, 3 という連番のインデックスになります。大量のデータを連結するときは、この設定をしておくのが無難です。
横方向の連結
axis=1 を指定すると、横方向に連結できます。
df1 = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30]
})
df2 = pd.DataFrame({
'score': [80, 90],
'grade': ['A', 'A']
})
result = pd.concat([df1, df2], axis=1)
この場合、インデックスが一致する行同士が横に並びます。インデックスが異なると NaN が入るので注意してください。
列が異なる場合の挙動
縦に連結するとき、列が完全に一致していなくても連結できます。
df1 = pd.DataFrame({
'name': ['Alice'],
'score': [80]
})
df2 = pd.DataFrame({
'name': ['Bob'],
'grade': ['A']
})
result = pd.concat([df1, df2])
存在しない列は NaN で埋められます。共通の列だけを残したい場合は join='inner' を指定します。
result = pd.concat([df1, df2], join='inner')
3 つ以上のデータフレームを連結する
concat はリストを受け取るので、3 つ以上でも同じように連結できます。
df_list = [df1, df2, df3, df4]
result = pd.concat(df_list, ignore_index=True)
ループで作成した複数のデータフレームをまとめるときに便利です。
merge との使い分け
単純に縦・横に連結する。キーによるマッチングは行わない。同じ形式のデータを積み重ねるときに使う。
列の値をキーにして結合する。SQL の JOIN と同じ。関連するテーブルを結合するときに使う。
月ごとのデータをまとめるなら concat、マスターデータを紐づけるなら merge という使い分けが一般的です。