[最終更新] 2018年8月24日
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」)。
参考
参考にさせていただきました。ありがとうございます。
- Python pandas 図でみる データ連結 / 結合処理 – StatsFragments
- Pandas のデータフレームに行や列 (カラム) を追加する – Python でデータサイエンス
- pandas 入門 – pandasによるデータ処理の基礎
- pandas.DataFrame, Seriesのインデックスを振り直すreset_index | note.nkmk.me
関連記事
Python の記事
- [2018年5月11日] Pythonでユニークでランダムな文字列のリストを作成する
- [2018年1月29日] Pandasでcsv, excelデータの読み込み・書き込み
- [2018年1月19日] pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ
- [2018年1月16日] Pythonでファイル・ディレクトリ操作
- [2018年1月9日] pythonで画像をダウンロードして、URLに応じてディレクトリ分けする
- ---本記事---
- [2017年12月25日] PDFから文章を抽出する
- [2017年12月25日] seleniumのGoogle検索で最初にヒットしたサイトのスクリーンショットを撮る
- [2017年12月22日] pythonでExcelファイル内の半角をすべて全角にする
- [2017年11月14日] pythonのxlsxwriterでフォーマットの上書きをしたいが…
- [2016年10月22日] pythonのPyYAMLでブロック形式で書き込み(dump出力)
スポンサーリンク