PythonのPandasのデータフレームの連結について

Python,イメージ

AI実装検定のご案内

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のデータフレームの連結についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次