バナナでもわかる話

計量経済学・統計学が専門の大学院生です。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

python入門 pandasを使ったデータフレームの扱い

pythonには、Seriesというデータ構造とDataFrameというデータ構造があります。

データ分析において、これらのデータ構造に関する扱いを理解しておくことは必須ですので、簡単に入門記事を書いておこうと思います。


目次

スポンサーリンク


pandas

pandasはデータ分析に便利なデータ構造と、簡単に分析が行えるツールを備えています。

Rユーザーであればデータフレームは馴染み深いとは思いますが、pythonではpandasを入れないとデータフレームは使えません。


ということでpandasを読み込みましょう。

import pandas as pd

慣例に従い、pdという名前で読み込みます。


Seriesの利用

pandasではシリーズというデータ構造を使うことができます。

In : seq0=pd.Series([1,2,3])
     print(seq0)
Out : 
0    1
1    2
2    3
dtype: int64

リスト[1,2,3]を入力したはずなのに、一番左の列には0,1,2という値が入っています。
これはインデックスです。Seriesと普通の数字の列との大きな違いはこのインデックスにあります。

例えばインデックス0の値1を取り出したければ次のように入力することで取り出すことができます。

In : seq0[0]
Out : 1

値の入っている列だけを取り出したい場合はvalues,インデックスを取り出したい場合はindexで取り出せます。
取り出された値はnumpyのndarrayで取り出されます。

In : seq0.values
Out : array([1, 2, 3])

In : seq0.index
Out : RangeIndex(start=0, stop=3, step=1)


インデックスが0,1,...だと正直リストとの違いがあまりわからないので、インデックスを指定してSeriesを出力してみましょう。

In : seq1=pd.Series([1,2,3],index=["a","c","b"])
     print(seq1)
Out : 
a    1
c    2
b    3
dtype: int64

インデックスがa,c,bに変わりました。

発想としては辞書型に似ていますね。ちなみに辞書型もSeriesに変換できます。

In : seq2 = pd.Series({"a":1,"b":2})
     print(seq2)
Out : 
a    1
b    2
dtype: int64


インデックスの列を変更することも当然できて

In : seq0.index = ["q","w","e",]
     print(seq0)
Out : 
q    1
w    2
e    3
dtype: int64
Seriesを扱うメソッド

インデックスを使って並び変えたい!と思った場合、reindexで並べなおすことができます。
存在しないインデックスの場所にはデフォルトではNaNが入ります。fill_valueで変更することもできます。

In : seq0.reindex(["q","e","w","d"])
Out : 
q    1.0
e    3.0
w    2.0
d    NaN
dtype: float64

DataFrameの利用

Seriesを行列のような形に拡張して、行だけではなく列にも名前をつけたい場合があると思います。
そのような場合に利用するのがデータフレームです。Seriesと同様、辞書型から作成してみます。

In : DF1 = pd.DataFrame({"a":[1,2,3,4],"b":[5,4,3,2]})
     print(DF1)
Out : 
   a  b
0  1  5
1  2  4
2  3  3
3  4  2

列に名前がつきました。Rユーザーであれば、馴染深い形になってきましたね。

値の取り出し方ですが、まず列を指定する場合は簡単で、次のように行います。

In : DF1[["a","b"]]
Out : 
   a  b
0  1  5
1  2  4
2  3  3
3  4  2

In : DF1["b"]
Out : 
    b
0  5
1  4
2  3
3  2

In : DF1["b"][0]
Out : 5

行のみを指定する場合は、スライスします。

In : DF1[0:2]
Out :
   a  b
0  1  5
1  2  4


こんなこともできます

In : DF1[DF1>3]=100
Out : 
     a    b
0    1  100
1    2  100
2    3    3
3  100    2