PythonのPandasライブラリにおける「データフレームの連結(結合・統合)」は、データ分析の現場では非常によく使われる重要な操作です。
ここでは、連結の基本から応用まで体系的に解説していきます。
目次
Pandasにおける「連結」とは?
Pandasでの「連結(concatenation)」は、複数のデータフレームやシリーズを1つにまとめる操作です。
似た用語に「結合(join/merge)」や「追加(append)」もありますが、厳密にはそれぞれ役割が違います。
ここでは、特に「pd.concat()
」を中心に、縦方向・横方向への連結、キーやインデックスの扱いなど、実践的な内容を詳しく説明します。
基本的な縦方向の連結(行の追加)
import pandas as pd
df1 = pd.DataFrame({
'A': ['A0', 'A1'],
'B': ['B0', 'B1']
})
df2 = pd.DataFrame({
'A': ['A2', 'A3'],
'B': ['B2', 'B3']
})
# インデックスがそのまま残る
result = pd.concat([df1, df2])
print(result)
# インデックスをリセットしたい場合
result_reset = pd.concat([df1, df2], ignore_index=True)
print(result_reset)
ポイント
- インデックスが重複しているため、
ignore_index=True
を使うことが多いです。
pd.concat([df1, df2], ignore_index=True)
横方向の連結(列の追加)
df1 = pd.DataFrame({
'A': ['A0', 'A1'],
'B': ['B0', 'B1']
})
df3 = pd.DataFrame({
'C': ['C0', 'C1'],
'D': ['D0', 'D1']
})
result = pd.concat([df1, df3], axis=1)
print(result)
ポイント
axis=1
を指定することで列方向に連結されます。- 行数が一致していないと NaN が発生します。
インデックスやキーを使った連結
keys
を指定すると階層インデックス(MultiIndex)になる
df1 = pd.DataFrame({
'A': ['A0', 'A1'],
'B': ['B0', 'B1']
})
df2 = pd.DataFrame({
'A': ['A2', 'A3'],
'B': ['B2', 'B3']
})
result = pd.concat([df1, df2], keys=['x', 'y'])
print(result)
# 階層の一部を取り出すには .loc や .xs を使用
print(result.loc['x']) # x階層のデータだけ
ポイント
- 複数のデータをまとめて管理したいときに便利です。
.loc['x']
や.xs('x')
で階層を指定できます。
異なる列名を持つデータフレームの連結(union)
df1 = pd.DataFrame({'A': [1], 'B': [2]})
df2 = pd.DataFrame({'B': [3], 'C': [4]})
result = pd.concat([df1, df2], ignore_index=True)
print(result)
ポイント
- 存在しない列は NaN(欠損値)になります。
- 空の列が自動で補完されるという点に注意。
条件付きの連結(join
オプション)
join='inner'
:共通の列のみ残すjoin='outer'
(デフォルト):すべての列を残す
df1 = pd.DataFrame({'A': [1], 'B': [2]})
df2 = pd.DataFrame({'B': [3], 'C': [4]})
# outer(すべての列)→ デフォルト
result_outer = pd.concat([df1, df2], ignore_index=True, join='outer')
print("outer:\n", result_outer)
# inner(共通の列のみ)
result_inner = pd.concat([df1, df2], ignore_index=True, join='inner')
print("inner:\n", result_inner)
これは、共通列(この場合B)のみを連結します。
インデックスを意識した連結操作
df1 = pd.DataFrame({
'A': ['A0', 'A1'],
'B': ['B0', 'B1']
}, index=[0, 1])
df2 = pd.DataFrame({
'A': ['A2', 'A3'],
'B': ['B2', 'B3']
}, index=[2, 3])
result = pd.concat([df1, df2])
print(result)
# インデックスの初期化(連番にしたいとき)
result_reset = pd.concat([df1, df2]).reset_index(drop=True)
print(result_reset)
補足:concat()
・merge()
・join()
の違い
メソッド | 主な用途 | 特徴 |
---|---|---|
concat() | 縦横どちらの連結にも使える | 単純な構造の連結 |
merge() | SQLのJOINのようにキーで結合 | 複雑なマッチング |
join() | インデックスを基準に結合 | merge の簡易版 |
まとめ:どの連結方法を使うべきか?
用途 | メソッド | 特徴 |
---|---|---|
行の追加(縦方向) | pd.concat(..., axis=0) | データ構造が同じ前提 |
列の追加(横方向) | pd.concat(..., axis=1) | 行数を合わせる必要あり |
異なる列を柔軟に統合 | pd.concat(..., join='outer') | 欠損値に注意 |
共通列だけに限定 | pd.concat(..., join='inner') | フィルタ的な使い方 |
階層化された管理 | pd.concat(..., keys=[...]) | MultiIndexで管理可能 |
以上、PythonのPandasのデータフレームの連結についてでした。
最後までお読みいただき、ありがとうございました。