Pandasのconcatによるデータ結合方法

Pandasでは複数のデータセットを統合する際にconcat関数がよく使われる。この関数は柔軟なパラメータ設定により、縦方向・横方向の結合やインデックス・カラムの扱いを細かく制御できる。

axis:結合方向

デフォルトではaxis=0(縦方向)で結合される。

import pandas as pd
import numpy as np

# データフレーム作成
left_df = pd.DataFrame(np.zeros((3, 4)), columns=['x', 'y', 'z', 'w'])
mid_df = pd.DataFrame(np.ones((3, 4)), columns=['x', 'y', 'z', 'w'])
right_df = pd.DataFrame(np.full((3, 4), 2.0), columns=['x', 'y', 'z', 'w'])

# 縦方向に結合
combined = pd.concat([left_df, mid_df, right_df], axis=0)
print(combined)

結果のインデックスは各データフレームのオリジナルインデックス(0,1,2)が繰り返されるため、連続したインデックスが必要な場合は次項のオプションを使う。

ignore_index:インデックスのリセット

ignore_index=Trueを指定すると、結合後のインデックスが0から連番になる。

combined_reset = pd.concat([left_df, mid_df, right_df], axis=0, ignore_index=True)
print(combined_reset)

join:カラムのマッチング方式

join='outer'(デフォルト)はすべてのカラムを保持し、存在しない値はNaNで埋める。join='inner'は共通カラムのみを保持する。

# カラムが部分的に重複するデータフレーム
df_a = pd.DataFrame(np.zeros((3, 4)), columns=['p', 'q', 'r', 's'], index=[10, 11, 12])
df_b = pd.DataFrame(np.ones((3, 4)), columns=['q', 'r', 's', 't'], index=[11, 12, 13])

# outer join(全カラム)
result_outer = pd.concat([df_a, df_b], axis=0, join='outer')
print(result_outer)

# inner join(共通カラムのみ)
result_inner = pd.concat([df_a, df_b], axis=0, join='inner')
print(result_inner)

join_axes:特定の軸に沿った結合(非推奨)

※注:join_axesはPandas 1.0以降で非推奨となった。代わりにreindexなどを組み合わせる方法が推奨されるが、旧バージョンでの動作例を以下に示す。

# 横方向結合時にdf_aのインデックスのみを保持
result_joined = pd.concat([df_a, df_b], axis=1, join_axes=[df_a.index])
print(result_joined)

append:簡易縦方向結合

appendconcatの縦方向結合のショートカットであり、Seriesや複数DataFrameの追加も可能。

base = pd.DataFrame(np.zeros((2, 3)), columns=['A', 'B', 'C'])
extra_df = pd.DataFrame(np.ones((2, 3)), columns=['A', 'B', 'C'])
extra_series = pd.Series([9, 8, 7], index=['A', 'B', 'C'])

# DataFrameを追加
appended_df = base.append(extra_df, ignore_index=True)

# 複数DataFrameを一度に追加
multi_appended = base.append([extra_df, extra_df], ignore_index=True)

# Seriesを追加
with_series = base.append(extra_series, ignore_index=True)

ただし、appendはPandas 2.0で削除されたため、新規コードではpd.concatの使用が推奨される。

タグ: Pandas concat DataFrame merge data-manipulation

8月29日 00:27 投稿