Python学習メモ「PandasでDataFrameに行(Series)を追加していく方法」
最近機械学習を学ぶにあたって、新たにPythonを勉強しています。
データを扱う際に便利なPandasモジュールですが、DataFrameとSeriesの扱いって難しいですよね。
なかでもDataFrameにSeriesを追加していく方法がよく分からなかったのでメモ用にまとめてみました。
あ、あと、興味深く勉強しているのですが、PythonはJavaと違って型制約が緩いので、とっても記述しやすい反面逆に色々不安になってます(笑)
Pythonの不安
不安についての続きですが、(早く方法だけ知りたいって方は目次から「まとめ」へ飛んでください)
例えばListにint型とかString型とかを気にしないで要素をボンボン投げ込めちゃうのとか、、、
それでエラーが出ないのが、なんか気持ち悪い。
{}がないからどこまでがループ、関数なの!?みたいな。インデントで区別するなんてお利口です。
あとスクリプト言語なのでコンパイルがないのも気持ち悪いですよね。
途中まで実行されてるのに最後だけエラーになってたり。寸止めされてる気分です。あ、それじゃ気持ち良いのか。
本題
さて無駄話はさておき、今回はPythonの便利モジュールPandasより、DataFrameにSeriesを追加していく方法がよく分からなかったので、実験して考察してみました。
基本用語
- Series 一次元のデータの集まりで、ベクトルのようなもの。
Series([格納したいデータ], index=[], ...)のように利用します。indexは格納されている要素につける名前みたいなものです。
- DataFrame 二次元のデータの集まりで、行列のようなもの。
DataFrame( [格納したいデータ], index=, columns=,... ) のように利用します。indexは行名、columnsは列名です。
実験
以下が実験用のコードです。いくつかSeriesを作成し、DataFrameに追加することをしています。
#coding: utf-8 import pandas as pd from pandas import DataFrame, Series #よく使用するメソッドはfromでimportするといちいちモジュール名.と記述しなくて済む #空白のDataFrameを作成し、列名xの列,列名yの列を追加 df1 = DataFrame( columns=['x','y'] ) print "df1" print df1 print "" s1 = Series([5,10]) #Seriesを作成、index指定なし print "s1" print s1 print "" s2 = Series([5,10], index=['x','y']) #index指定あり print "s2" print s2 print "" s3 = Series([500,1000], index=['x','y']) print "s3" print s3 print "" #追加したいSeriesのindexに対応する列名(Columns)がDataFrame内にない場合 df2 = df1.append(s1, ignore_index=True) #ignore~が無いとエラー print "df2" print df2 print "" #追加したいSeriesのindexに対応する列名(Columns)がDataFrame内にある場合 df3 = df1.append(s2, ignore_index=True) print "df3" print df3 print "" #df3にs3を追加、このようにしてSeriesをいくつも追加できる df4 = df3.append(s3, ignore_index=True) print "df4" print df4
実行すると以下のようになります。
df1 Empty DataFrame Columns: [x, y] Index: [] s1 0 5 1 10 dtype: int64 s2 x 5 y 10 dtype: int64 s3 x 500 y 1000 dtype: int64 df2 x y 0 1 0 NaN NaN 5.0 10.0 df3 x y 0 5 10 df4 x y 0 5 10 1 500 1000
まとめ
- DataFrameにSeriesを追加する方法は、「 DataFrame名.append(Series, ignore_index=True) 」
- その際に、追加するSeriesのindexがDataFrameのColumns(列名)と一致している場合、その一致している列にうまくはまるようにSeriesが格納される。(実験でのdf3及びdf4参照)
- 逆にSeriesのindexがDataFrameに存在しない場合、新たにColumnsが追加されて格納される。(実験でのdf2参照)
これにforを用いればどんどんデータをDataFrameの行に追加できますね~。
もともとはSeriesは縦に並んだデータなのに、DataFrameに追加されると横になるのがちょっと奇妙でした。
終わり。