pandas

【Pandas】DataFrameに行を追加する

MAX

pandasで作成したDataFrameに行を追加する方法について。

カラムが同じデータフレームであれば、行を追加するのは簡単だが、カラム名がない場合(DataFrameにSeriesを結合する場合)など、どこまでが許されるのかについて説明する。

結論から言うと、Seriesの結合は上手く動作せず、DataFrame同士の結合にするか、DataFrameを作り直すかが必要になる。

スポンサーリンク

appendとconcat

DataFrameに行を追加する方法として、appendをconcatを使う方法がある。

appendは「将来的に廃止される方向性のためconcatの使用を推奨」とのWarningが表示されるため、今のうちから使用は控えた方が良いと思う。

appendの動作はconcatよりも曖昧でも結合できる場合もあるが、その分、思った通りに結合できているかの確認が必要となるため、個人的には使用しない方が良いと思う。

そのため、本記事ではappendの動作は扱わず、concatを使用して結合する場合について説明する。

DataFrameにDataFrameで行追加する

DataFrameにDataFrameで行追加する場合、お互いの列名が一致している必要がある。

1import pandas as pd
2
3data1 = [[1, 2, 3]]
4data2 = [[4, 5, 6]]
5
6col_names = ["colA", "colB", "colC"]
7
8df1 = pd.DataFrame(data1, columns=col_names)
9df2 = pd.DataFrame(data2, columns=col_names)
10
11df_conc = pd.concat([df1, df2], axis=0)
12
13print(df_conc)
14#    colA  colB  colC
15# 0     1     2     3
16# 0     4     5     6
17

列名が一致していない場合は、お互いの列を合わせた形になる。

1data1 = [[1, 2, 3]]
2data2 = [[4, 5, 6]]
3
4col_names = ["colA", "colB", "colC"]
5
6df1 = pd.DataFrame(data1, columns=col_names)
7df2 = pd.DataFrame(data2, columns=["colAA", "colB", "colCC"])
8
9df_conc = pd.concat([df1, df2], axis=0)
10print(df_conc)
11
12#    colA  colB  colC  colAA  colCC
13# 0   1.0     2   3.0    NaN    NaN
14# 0   NaN     5   NaN    4.0    6.0

列名が一致する部分のみ下に結合され、一致しない列名については、値のない部分がNaNになる。

DataFrameにSeriesを行追加する

DataFrameの例で見た通り、DataFrameに行追加する場合、列名が一致している必要がある。

しかし、Seriesには列名がない(インデックスならそれぞれの値に名前を付けられるが)ため、そのままでは上手く結合できない。

そのため、SeriesをDataFrameにしてから結合するか、DataFrameとSeriesをndarrayにして結合してからDataFrameにする必要がある。

SeriesをDataFrameに変換してから結合する

結合先のDataFrameが大きい場合、こちらの方が良いかもしれない。

1data1 = [[1, 2, 3]]
2data2 = [4, 5, 6]
3
4col_names = ["colA", "colB", "colC"]
5
6df1 = pd.DataFrame(data1, columns=col_names)
7sr1 = pd.Series(data2, name="sr1")
8
9df_conc = pd.concat([df1, pd.DataFrame(data=sr1.values.reshape(1, -1), columns=df1.columns)], axis=0)
10print(df_conc)
11#    colA  colB  colC
12# 0     1     2     3
13# 0     4     5     6

Seriesをvaluesでndarrayに変換してreshapeで縦を横向きに変える。

列名には結合先のDataFrameの列名を設定してからconcatで結合する。

DataFrameとSeriesをndarrayに変換して結合する

1import numpy as np
2import pandas as pd
3
4data1 = [[1, 2, 3], [4, 5, 6]]
5data2 = [7, 8, 9]
6
7col_names = ["colA", "colB", "colC"]
8
9df1 = pd.DataFrame(data1, columns=col_names)
10sr1 = pd.Series(data2, name="sr1")
11
12
13df_conc = pd.DataFrame(np.vstack([df1.values, sr1.values]), columns=df1.columns)
14print(df_conc)
15#    colA  colB  colC
16# 0     1     2     3
17# 1     4     5     6
18# 2     7     8     9

valuesでDataFrameとSeriesをndarrayに変換し、vstackで縦に繋げる。

処理速度やメモリ使用量が問題なければ、こちらの方法でも良いかもしれない。

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました