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)を、豊富な例とともに解説します!楽しみにしていてくださいね!
コメント