pythonのデータフレームライブラリPandasで、行の追加(縦方向の連結)の操作メモ。列の追加(横方向の結合)ではなく。一行だけ追加する感じで。
基本はappendとconcat。列名で一致しないところはNaNで埋められる。ついでにインデックスが重複する時はreset_index()。
やること
pandasで行を追加する。たとえばdf1に一行だけのdf2を追加する感じを想定。
この場合、df1.append(df2)か、pd.concat([df1,df2])を使う。
append
appendを使って追加。
import pandas as pd
df1 = pd.DataFrame({'one': [1,2,3], 'two': [10,20,30]}, index=['a','b','c'])
df2 = pd.DataFrame({'one': [4], 'three': [400]}, index=['d'])
df = df1.append(df2)
print(df)
結果は以下。
one three two
a 1 NaN 10.0
b 2 NaN 20.0
c 3 NaN 30.0
d 4 400.0 NaN
列名が一致しないところはNaNで埋められる点に注意。それに合わせて他行の型も小数になってますな。
concat
concatを使って追加。
import pandas as pd
df1 = pd.DataFrame({'one': [1,2,3], 'two': [10,20,30]}, index=['a','b','c'])
df2 = pd.DataFrame({'one': [4], 'three': [400]}, index=['d'])
df = pd.concat([df1,df2])
print(df)
結果は上に同じ。
axis=1とすると、joinのように縦方向の結合となる。
appendとconcat
appendとconcatで内部的には挙動が異なるようで、concatでうまく連結できなかったときにも(何故できなかったのかわからない…)appendではうまくいくこともあった。「pandasのデータフレームを連結したときに列の順番を変えない。 - Qiita」のようなこともあるらしい。
インデックスが重複するので振り直す
もしインデックスが重複して、それが具合が悪い時には、処置をしないといけない。たとえばreset_index()で番号を振り直す。
df = pd.concat([df1,df2]).reset_index(drop=True)
オプションのdrop=Trueは、元のインデックスを削除する。普通にreset_index()とすると、元のインデックスが新たに列として作られる(参考「pandas.DataFrame, Seriesのインデックスを振り直すreset_index | note.nkmk.me」)。
参考
参考にさせていただきました。ありがとうございます。
コメント