Python で解析 8

“Advent Calendar 2013 - Python で解析!” の八日目。DataFrame - 5

1. お決まりの準備を…

今回は DataFrame の保存だが、その前に例によって準備を。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({
   ...: u'名前': [u'山田', u'鈴木', u'佐藤', u'木村'],
   ...: u'性別': [u'男', u'男', u'女', u'女'] ,
   ...: u'身長': [181, 173, 159, 164],
   ...: u'体重': [79, 71, 51, 52]
   ...: })

In [3]: df
Out[3]:
   体重  名前 性別   身長
0  79  山田  男  181
1  71  鈴木  男  173
2  51  佐藤  女  159
3  52  木村  女  164

2. バイナリ形式のセーブ

DataFrame はそのまま保存できる。

df.save('hoge.pickle')

…が、save すると "save is deprecated, use to_pickle" と警告が表示されるので、to_pickle の方を使うようにする。

df.to_pickle('hoge.pickle')

保存したファイルを読み込む場合は read_pickle を使う。

In [5]: df2 = pd.read_pickle('hoge.pickle')

In [6]: df2
Out[6]:
   体重  名前 性別   身長
0  79  山田  男  181
1  71  鈴木  男  173
2  51  佐藤  女  159
3  52  木村  女  164

再現できた。

3. テキスト形式のセーブ

to_csv でテキスト形式で保存できる。

df.to_csv('hoge.csv')

日本語を含む場合は、encoding を指定する。

In [9]: df.to_csv('hoge.csv', encoding='utf-8')

In [10]: !cat hoge.csv
,体重,名前,性別,身長
0,79,山田,男,181
1,71,鈴木,男,173
2,51,佐藤,女,159
3,52,木村,女,164

タブ区切りなら、sep を指定する。

In [11]: df.to_csv('hoge.tsv', encoding='utf-8', sep='\t')

In [12]: In [10]: !cat hoge.tsv
	体重	名前	性別	身長
0	79	山田	男	181
1	71	鈴木	男	173
2	51	佐藤	女	159
3	52	木村	女	164

4. Excel 形式ののセーブ

Excel 形式でも保存できるが、そのためには xlwt をインストールしておく必要がある。

$ pip install xlwt

テキスト形式の保存より、少し手間がかかるが、次のような手順で Excel 形式で保存できる。

In [13]: xl = pd.ExcelWriter('hoge.xls')

In [14]: df.to_excel(xl, 'Sheet1')

In [15]: xl.save()

In [16]: !ls -l hoge.xls
-rw-r--r--  1 tokutomi  staff  5632 12  8 09:27 hoge.xls

pythonista ならこう書きたいところだが…。

with(pd.ExcelWriter('hoge.xls')) as xl:
  df.to_excel(xl, 'Sheet1')

"AttributeError: __exit__" とのことで、with には対応してないようだ。残念…。

そういえば、さらっと '!cat' や '!ls' のようにシェルコマンドを書いているが、 ipython から抜けずにシェルコマンドを使えて便利である。実は先頭の '!' を付けずに 'ls' とだけしても使えるのだが、同じ変数名があったりなどすると、そちらが優先されるので、 '!' を付けて実行する方が確実だろう。

今回は、こんなところで。