最終更新日:2021/8/26
dfどうしの結合、連結の方法を説明します。ここでは、特に縦方向(行方向)への結合、連結を扱います。
このページでは、「結合」と「連結」はほぼ同じ意味で用いています。
幾つか方法がありますが、ここでは、目的への一番の近道と思われる方法だけを扱います。
【説明すること】
- 1. はじめに
- 2. df+dfの結合 :
pd.concat([df1, df2], axis=0, ignore_index=True)
- 3. df+seの結合 :
df.append(se, ignore_index=True)
- 参考HP
1. はじめに
縦方向(行方向)への結合・連結は、欠損値が生じないようにする為には、基本的には元のdfと、追加するdfで、同じカラム名(列名)を持っていなければなりません。
例えば、Excelのように1-5行目と6-10行目で違うカラム名のものを結合する、というのは簡単にはできません。
また、indexとカラム名(列名)を常に意識することが重要です。
カラム名、indexを意識する、ということはlistでは結合ができず、基本的にはDataFrame(df)かSeries(se)を結合・連結の対象に扱うことになります。
なぜならば、listにはそれらの考え方が無いからです。
尚、縦への結合は1行を追加する、という操作にも応用できます。
2. df+dfの結合 : pd.concat()
dfにdfを結合する場合、
pd.concat([df1, df2], axis=0, ignore_index=True)
を使います。
axis=0
は方向を指定するオプションで、縦方向(行方向)という意味で、よく使います。
他にaxis=1
があり、これは横方向(列方向)という意味です。
また、ignore_index=True
は、結合したdfのindexを振り直します。振り直す必要がない場合は、省略できます。または、ignore_index=False
を指定します。
・カラム名(列名)が一致しない場合
結合の対象とするdf1とdf2のカラム名が一致しない場合、結合したdfに、不一致なカラムが追加されます。
以下のcsvファイルを読み込んで例を挙げます。
a004_010a_a.csv, a004_010a_b.csv, a004_010a_c.csv
3. df+seの結合 : df.append(se)
dfとseを結合する場合は、
df.append(se, ignore_index=True)
と書きます。ignore_index=True
は、上記2.と同じで、結合したdfのindexを振り直します。振り直す必要がない場合は、省略できます。
結合するseのindex(seにカラム名は無い)が、対象のdfのカラム名と一致するか、で分けておきます。理屈は同じですが、違いをはっきりさせる為です。
3.1. seのindexがdfのカラム名と一致する場合3.2. seのindexがdfのカラム名と一致しない場合
他にも、pd.concat([df, se])
を使う方法などがありますが、多くの場合、必要とする結果はdf.append()
だと思います。
これ以外は、複雑なので、ここでは省略します。
尚、seはdfの1列を抜き出したものでもあるので、dfに1行を追加する場合も、この操作で実現します。
コードを書く際は、indexとカラム名を意識してください。
3.1. seのindexがdfのカラム名と一致する場合
df.append(se, ignore_index=True)
と書きます。ignore_index=True
は、前出の通りです。
この場合、dfの一番下にseが追加されます。seが横向きで下に追加されるイメージで、行の追加という感じです。そして、結合後のdfのindex名がseのnameになります。
これが、多くのケースで必要とされる結果だと思います。
繰り返しになりますが、indexとカラム名、そしてseのnameを意識する事がとても重要です。
・結合後のdfのindex名(縦方向のラベル) = seのname
・結合後のdfのカラム名(横方向のラベル) = seのindex名 = もとのdfのカラム名
他のdfから1行をコピーして張り付ける場合は、以下のようになります。
3.2. seのindexがdfのカラム名と一致しない場合
同じく、
df.append(se, ignore_index=True)
と書きます。ignore_index=True
は、前出の通りです。
この場合、カラムが追加され、そのカラム名がseのindex名となります。seが横向きで右にとって付けるイメージです。結合した結果のdfのindex名がseのnameになります。
結合後のdfのindex名(縦方向のラベル) = seのname
結合後のdfのカラム名(横方向のラベル) = もとのdfのカラム名 + 不一致なseのindex名
参考HP
以下のHPがとても詳しいので、参考にしてください。図があって、とても分かりやすいです。
https://sinhrks.hatenablog.com/entry/2015/01/28/073327