てんぺるのぶろぐ

IT関連のこと、体験談、備忘録など。文系エンジニア、もがきます。

Python学習メモ「PandasでDataFrameに行(Series)を追加していく方法」

最近機械学習を学ぶにあたって、新たにPythonを勉強しています。


データを扱う際に便利なPandasモジュールですが、DataFrameとSeriesの扱いって難しいですよね。
なかでもDataFrameにSeriesを追加していく方法がよく分からなかったのでメモ用にまとめてみました。


あ、あと、興味深く勉強しているのですが、PythonJavaと違って型制約が緩いので、とっても記述しやすい反面逆に色々不安になってます(笑)

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に追加されると横になるのがちょっと奇妙でした。


終わり。