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:簡易縦方向結合
appendはconcatの縦方向結合のショートカットであり、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の使用が推奨される。