pandasメモ

ドキュメントが充実しているのでそこを読めばよいのだが、Rで今まで行っていた作業を置き換えていく意味でメモ。
http://pandas.pydata.org/pandas-docs/stable/
適宜、追記・修正する。

import pandas as pd
import matplotlib.pyplot as plt
from pandas import DataFrame
import xlrd # xlsを読み込む際に必要
import numpy as np
import sqlite3

# データフレームを作る
smp = {'state' : ['Ohio', 'Ohio', 'Ohio', 'Nebada', 'Nebada'], 
            'year' : [2000, 2001, 2002, 2001, 2002],
            'pop' : [1.5, 1.6, 1.7, 3.5, 4.3]}
frame = DataFrame(smp)

# データフレームの要素へのアクセス
frame.year # frame$year
frame['year'] # frame$year
frame.head() # head
frame.tail() # tail
frame2 = DataFrame(smp, index = ['one', 'two', 'three', 'four', 'five']) # インデックスを追加
frame2.ix['one']
frame2.describe() # summary

# データを読み込む
data = pd.read_csv('diamonds.csv') # ggplot2のdiamondsデータをcsv出力したもの
xlsx_file = pd.ExcelFile('diamonds.xlsx') # openpyxlのインストールが必要, xlsも可
xlsx_file.sheet_names # シート名を確認
data = xlsx_file.parse('diamonds') # シート名を指定してパース

# web上のデータを読み込む→http://docs.scipy.org/doc/numpy/reference/generated/numpy.DataSource.html
ds = np.DataSource(None)
f = ds.open('https://dl.dropbox.com/u/956851/game_modified.csv')
d_web = pd.read_csv(f)
f.close()

# ピボットテーブル
data2 = DataFrame(data[:100], columns = ['cut', 'clarity', 'price', 'color'])
pd.pivot_table(data2, values = 'price', rows = ['clarity', 'cut'], cols = ['color'], aggfunc = 'sum')


# マージ
data.l = DataFrame(data[:6], columns = ['carat', 'clarity', 'price', 'depth'])
data.r = DataFrame(data[-6:], columns = ['carat', 'clarity', 'price', 'depth'])
pd.merge(data.l, data.r, on = 'clarity')
pd.merge(data.l, data.r, on = 'clarity', how = 'outer')
pd.merge(data.l, data.r, on = 'clarity', how = 'left')
pd.merge(data.l, data.r, on = 'clarity', how = 'right')

# 結合
pd.concat([data.l, data.r]) # rbind

# ソート
data3.sort_index(by = ['clarity', 'x'])
data3.sort_index(by = ['clarity', 'x'], ascending = False)

# groupby
data4 = DataFrame(data[:100], columns = ['cut', 'color', 'clarity', 'carat', 'price'])
data4.groupby('clarity').mean() # 数値のものだけ集計される
data4.groupby(['cut', 'clarity']).mean() # 2水準以上の場合
data4.groupby(['cut', 'clarity']).mean()['price'] # 結果に対してのアクセス

# apply
data5 = DataFrame(data[:6], columns = ['carat', 'price', 'depth'])
f = lambda x: x.max() - x.min()
data5.apply(f)
data5.apply(f, axis = 1) # 行方向(デフォルトは列方向)
f2 = lambda x: '%.2f' % x # 数値の書式を下2桁表示に変更
data5.applymap(f2) # データフレームの各要素に適用

# vlookup
clarity_to_class = {'SI1' : 'A', 'SI2' : 'B', 'VS1' : 'C', 'VS2' : 'D', 'VVS2' : 'E'}
data3['class'] = data3['clarity'].map(clarity_to_class)

# DB:SELECT文
import pandas.io.sql as sql
con = sqlite3.connect(':memory:')
sql.read_frame('select * from test', con)

# データを書き出す-csv
data2.to_csv('output.csv')

# データを書き出す-エクセル
writer = pd.ExcelWriter(’output.xlsx’)
data2.to_excel(writer, sheet_name=’sample’)
writer.save()

# matplotlibによる描画
data.carat.plot()
plt.show()