【第11回】Pandasのconcatで縦結合・横結合を行う方法を実例付きでやさしく解説

Pythonのデータ分析ライブラリ「Pandas」で、データフレームを結合(concat)する方法をわかりやすく解説します!

▶️ concatの公式ドキュメントも参考にしてください:
pandas DataFrame sort_index Documentation

今回は、縦結合(行方向の結合)横結合(列方向の結合)について、例を交えて紹介します。

1. サンプルデータの作成(結合前データ)

コード例

import pandas as pd

df = pd.DataFrame({
    "名前": ["太郎", "花子", "次郎", "美香", "健一", "恵子", "翔", "茜", "隆", "葵"],
    "年齢": [23, 29, 35, 42, 18, 33, 27, 24, 31, 30],
    "職業": ["エンジニア", "デザイナー", "教師", "医師", "学生", "看護師", "プログラマー", "販売員", "弁護士", "研究者"],
    "年収(円)": [4500000, 5500000, 4900000, 7300000, 0, 4000000, 6000000, 3200000, 8000000, 5800000],
    "居住地": ["東京", "大阪", "名古屋", "札幌", "福岡", "東京", "神戸", "仙台", "横浜", "千葉"],
    "勤続年数": [2, 4, 10, 15, 1, 5, 3, 1, 12, 8]
})

df

出力結果

インデックス 名前 年齢 職業 年収(円) 居住地 勤続年数
0 太郎 23 エンジニア 4500000 東京 2
1 花子 29 デザイナー 5500000 大阪 4
2 次郎 35 教師 4900000 名古屋 10
3 美香 42 医師 7300000 札幌 15
4 健一 18 学生 0 福岡 1
5 恵子 33 看護師 4000000 東京 5
6 27 プログラマー 6000000 神戸 3
7 24 販売員 3200000 仙台 1
8 31 弁護士 8000000 横浜 12
9 30 研究者 5800000 千葉 8

2. 縦に結合する(concat, axis=0)

【例】1行だけデータを追加して縦に結合する

追加データのコード

df1 = pd.DataFrame({
    "名前": ["三郎"],
    "年齢": [18],
    "職業": ["学生"],
    "年収(円)": [0],
    "居住地": ["東京"],
    "勤続年数": [0]
})

df1

出力結果

インデックス 名前 年齢 職業 年収(円) 居住地 勤続年数
0 三郎 18 学生 0 東京 0

【ポイント】インデックスをそのまま維持して結合(ignore_indexなし)

df2 = pd.concat([df, df1])
df2

出力結果

インデックス 名前 年齢 職業 年収(円) 居住地 勤続年数
0 太郎 23 エンジニア 4500000 東京 2
1 花子 29 デザイナー 5500000 大阪 4
2 次郎 35 教師 4900000 名古屋 10
3 美香 42 医師 7300000 札幌 15
4 健一 18 学生 0 福岡 1
5 恵子 33 看護師 4000000 東京 5
6 27 プログラマー 6000000 神戸 3
7 24 販売員 3200000 仙台 1
8 31 弁護士 8000000 横浜 12
9 30 研究者 5800000 千葉 8
0 三郎 18 学生 0 東京 0

【ポイント】インデックスを振り直して結合(ignore_index=True)

df3 = pd.concat([df, df1], ignore_index=True)
df3

出力結果

インデックス 名前 年齢 職業 年収(円) 居住地 勤続年数
0 太郎 23 エンジニア 4500000 東京 2
1 花子 29 デザイナー 5500000 大阪 4
2 次郎 35 教師 4900000 名古屋 10
3 美香 42 医師 7300000 札幌 15
4 健一 18 学生 0 福岡 1
5 恵子 33 看護師 4000000 東京 5
6 27 プログラマー 6000000 神戸 3
7 24 販売員 3200000 仙台 1
8 31 弁護士 8000000 横浜 12
9 30 研究者 5800000 千葉 8
10 三郎 18 学生 0 東京 0

3. 横に結合する(concat, axis=1)

【例】新しい列(兄弟数)を追加する

df4 = pd.DataFrame({
    '兄弟数': [0,2,1,0,3,1,1,1,0,2,0]
})

df4

出力結果

インデックス 兄弟数
0 0
1 2
2 1
3 0
4 3
5 1
6 1
7 1
8 0
9 2
10 0

筆者の体験談:concatでやってしまった失敗

はじめてconcatを使ったとき、「縦結合と横結合の切り替えにはaxisの指定が必要」というのを見逃してしまい、横に結合したつもりが縦にずれてしまったということがありました。

さらに、インデックスを意識せずに結合してしまい、同じインデックス番号が混在して重複データのように見えたり、後の処理でindexを使うときにバグを引き起こした経験があります。

改善策:結合時には必ず次の2点を確認しています:

  • axis=0(縦)かaxis=1(横)か
  • ignore_index=Trueをつけるべきかどうか

また、出力結果をdf.head()で直後に確認する癖をつけるようになってから、トラブルは激減しました。

【ポイント】行数を揃えて横結合する

df5 = pd.concat([df3, df4], axis=1)
df5

出力結果

インデックス 名前 年齢 職業 年収(円) 居住地 勤続年数 兄弟数
0 太郎 23 エンジニア 4500000 東京 2 0
1 花子 29 デザイナー 5500000 大阪 4 2
2 次郎 35 教師 4900000 名古屋 10 1
3 美香 42 医師 7300000 札幌 15 0
4 健一 18 学生 0 福岡 1 3
5 恵子 33 看護師 4000000 東京 5 1
6 27 プログラマー 6000000 神戸 3 1
7 24 販売員 3200000 仙台 1 1
8 31 弁護士 8000000 横浜 12 0
9 30 研究者 5800000 千葉 8 2
10 三郎 18 学生 0 東京 0 0

4. まとめ

方法 関数 注意ポイント
縦結合(インデックス維持) pd.concat([df, df1]) インデックス重複に注意!
縦結合(インデックス振り直し) pd.concat([df, df1], ignore_index=True) 0から振り直し。データ管理がラク
横結合 pd.concat([df3, df4], axis=1) 行数を合わせないとNaNが発生する

次回予告

次回は、キー(共通列)を使ったデータフレーム結合(merge)を、豊富な例とともに解説します!楽しみにしていてくださいね!

▲ ページトップへ戻る

コメント

タイトルとURLをコピーしました