【Pandas】DataFrameに行を追加する
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で縦に繋げる。
処理速度やメモリ使用量が問題なければ、こちらの方法でも良いかもしれない。