2016年9月11日日曜日

Pandas: Pythonのデータフレーム、データ加工

Pythonのデータフレーム、データ加工

Pandas

データフレームは行列のようなものと言えるが、行名と列名でデータにアクセスできる点が配列との違い。
カレントディレクトリに以下のsample1.csvファイルを作っておき、Pandasを使って読み込む。(カレントディレクトリは"%pwd"で分かる)

〈sample1.csv>
Team,Win,Draw,Lose
Japan,3,0,0
Iraq,2,0,1
Jordan,1,0,2
Palestine,0,0,3

------------------------------------------------
In [53]: import pandas
In [55]: df=pandas.read_csv('sample1.csv',index_col='Team')

(Pandasのread_csv()関数を利用してcsvファイルのデータを読み込む。第一引数に読み込むファイルパスを指定。index_colには行名として採用する列を指定)

In [56]: df  (読み込んだデータを表示)
Out[56]:
           Win  Draw  Lose
Team
Japan        3     0     0
Iraq           2     0     1
Jordan       1     0     2
Palestine    0     0     3

In [57]: df['Win']  (列名を指定したデータ表示)
Out[57]:
Team
Japan        3
Iraq         2
Jordan       1
Palestine    0
Name: Win, dtype: int64

In [60]: df[['Win','Lose']]  (複数の列名を指定したデータ表示)
Out[60]:
           Win  Lose
Team
Japan        3     0
Iraq         2     1
Jordan       1     2
Palestine    0     3

In [61]: df[df.Win >=2]  (指定列の値によるデータの絞り込み)
Out[61]:
       Win  Draw  Lose
Team
Japan    3     0     0
Iraq     2     0     1

In [62]: df.sum(numeric_only=True)  (データの合計)
Out[62]:
Win     6
Draw    0
Lose    6
dtype: int64

In [63]: df.to_json('sample.json',orient='index')  (JSON形式でのファイル出力)

-----------------------------------------------------------
クロス集計

以下のsample2.csvを読み込む

date,item,price
2016-09-01,apple,300
2016-09-01,apple,300
2016-09-01,orange,250
2016-09-02,orange,240
2016-09-02,orange,240
2016-09-02,banana,260

In [64]: df2=pandas.read_csv('sample2.csv')

(アイテム、日付ごとに価格を合計)
In [73]: df2.pivot_table(index=['date'],columns='item',aggfunc=[sum])
Out[73]:
              sum
            price
item        apple banana orange
date
2016-09-01  600.0    NaN  250.0
2016-09-02    NaN  260.0  480.0

(レコード数を合計)
In [74]: df2.pivot_table(index=['date'],columns='item',aggfunc=[len])
Out[74]:
             len
           price
item       apple banana orange
date
2016-09-01   2.0    NaN    1.0
2016-09-02   NaN    1.0    2.0


0 件のコメント: