pandas.concat
の axis
パラメータは、「どの方向に連結するか」 を決める非常に重要な引数です。
axis=0
と axis=1
の違いを中心に、詳しく整理して説明します。
目次
基本構文
import pandas as pd
pd.concat([df1, df2], axis=0) # 行方向に連結
pd.concat([df1, df2], axis=1) # 列方向に連結
※このコード単体では、出力はできません。
objs
: 連結するDataFrame
またはSeries
のリストや辞書axis
: 0(行方向)か 1(列方向)- デフォルトは
axis=0
(行方向)
axis=0
(行方向に連結)
- デフォルトの動作。
df1
の下にdf2
を積み重ねるイメージ。- インデックスがそのまま残るので、重複する可能性がある。
- 列名が一致していない場合、その列には
NaN
が入る。
例
import pandas as pd
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
print(pd.concat([df1, df2], axis=0))
インデックスがそのままなので、必要に応じて ignore_index=True
を指定する。
pd.concat([df1, df2], axis=0, ignore_index=True)
axis=1
(列方向に連結)
df1
とdf2
を横に並べるイメージ。- 行インデックスに基づいて結合するため、インデックスが揃っていないと
NaN
が生じる。
例
df1 = pd.DataFrame({"A": [1, 2]}, index=["x", "y"])
df2 = pd.DataFrame({"B": [3, 4]}, index=["y", "z"])
print(pd.concat([df1, df2], axis=1))
行インデックスを基準に結合するため、SQL の「外部結合」に近い挙動になる。
axis
の使い分けまとめ
axis=0
: データを縦に積み重ねる(レコード追加したいとき)axis=1
: データを横に結合する(新しい特徴量・列を追加したいとき)
関連オプション
ignore_index=True
: 行方向結合時にインデックスを振り直すkeys=["df1", "df2"]
: どのデータから来たか分かるように階層化インデックスをつけるjoin="inner"
: 共通部分だけ残す(デフォルトは"outer"
で和集合)
concat
と merge
/ join
の違い
concat
: 単純に縦横にくっつけるmerge
: SQL のJOIN
に近い(キーを指定して結合)join
: インデックスをキーに結合(merge
のインデックス版)
まとめ
axis=0
→ 縦方向に積む(データ追加)axis=1
→ 横方向に並べる(特徴量追加)
という使い分けになります。
以上、PythonのPandasのconcat axisについてでした。
最後までお読みいただき、ありがとうございました。