Python
pandas

pandasでよく使う文法まとめ

Pythonのデータ分析用ライブラリ「pandas」でよく使う文法をまとめました.


  • Change log

2019-02-18 表示拡大の方法を更新

2018-05-06 コメント反映(pd.set_option('display.width', 100))
2018-02-14 リンクの修正
2017-11-01 df.fillna(method='ffill')の説明を修正
2017-06-09 リンク切れ等の修正
2016-10-10 例の編集
2016-06-21 df.rolling, pd.date_range, pd.datetime, df.pivotの追加,その他の例の追加


CSVファイルの扱い


pd.read_csv(読み込み)

多くのオプションが用意されているので,csv以外でもなんでも読み込める.

import pandas as pd

df = pd.read_csv('some.csv')

例:複数column(datehour)をまとめて,datetime型のindex(date_hour)として読む場合

df = pd.read_csv('some.csv', parse_dates={'date_hour':['date', 'hour']}, index_col='date_hour')

例:日本語の入ったファイル,かつ--を欠損データ扱いにする場合

df = pd.read_csv('some.csv', encoding='Shift_JIS', na_values='--')


  • オプション一覧

option
意味

index_col
indexとするcolumn名

parse_dates
datetime型で読み込むcolumn名(リストや辞書)

date_parser
parse_datesで指定したcolumnを読み込む自作関数

na_values
欠損値とする文字列(リスト)

encoding
'Shift_JIS'など

sep
区切り文字(' ':スペースの場合)


df.to_csv(書き込み)

恐ろしく簡単にcsvファイルに書き込める.オプションも豊富.

df.to_csv('some2.csv')

例:indexがいらない場合

df.to_csv('some2.csv', index=None)

例:indexに名前をつける場合

df.to_csv('some2.csv', index_label='date')


欠損値の扱い


df.dropna(削除)

欠損値(nan)のある行(index)を削除

df = df.dropna()

例:特定のcolumn(tempdepth)に欠損値がある場合,その行を削除する

tempdepth以外の欠損値は無視する)

df = df.dropna(subset=['temp','depth'])


df.fillna(穴埋め)

例:定数(0)で穴埋め

df = df.fillna(0)

例:前方(後方)穴埋め (2017/11/01 @hadacchiのコメントを反映して修正済み

df = df.fillna(method='ffill')  # forward 穴埋め  nan 1.0 nan -> nan 1.0 1.0 (forward  = indexの増加方向 = DataFrameの下方向)

df = df.fillna(method='bfill') # backward穴埋め nan 1.0 nan -> 1.0 1.0 nan (backward = indexの減少方向 = DataFrameの上方向)


df.interpolate(補間)

多くの補間手法が用意されている.

df = df.interpolate(method='index')


df.resample(リサンプル)

時系列データの解像度(頻度)を変更する.

自分が使うときはデータ数を減らすことが多いので圧縮するための関数と認識.

例:1時間毎のデータを日平均に変換(欠損値は無視して平均される)

#daily = hourly.resample('D', how='mean') <- 古い書き方

daily = hourly.resample('D').mean()

例:上だと値が 00:00 に配置されるが,12:00 にしたい場合

daily = hourly.resample('D', loffset='12H').mean()


時間のフォーマット

Charactor
意味
備考

M

0.5M で半月とはならない

D

15D で手を打っている

H
時間
12H は12時間

T or min

30min で30分


df.rolling(移動平均)

n項移動平均や最大値などを取る

例:3項移動平均(center=Trueで中央(この場合第2項)に値を配置)

ma3 = hourly.rolling(3, center=True).mean()


時間の扱い


pd.date_range

連続したdatetime変数を簡単に作れる

date = pd.date_range('2012-1-1', '2012-1-2', freq='D')

例:上のままだとpandasのTimestampなので,pythonのdatetime変数に戻す場合

date = pd.date_range('2012-1-1', '2012-1-2', freq='D').to_pydatetime()


pd.datetime

import datetimeがいらない

date = pd.datetime(2012, 1, 1, 0, 0, 0)


その他よく使う関数


df.describe(要約統計量)

各columnのデータ数、平均、分散などの統計量をざっと見る.

print df.describe()


df.groupby(集約)

columnでグループ化(columnの値をindexとして扱えるように変換)することでデータを扱いやすくする.

stack, unstackよりも判りやすい.

例:複数column(typetime)でグループ化し、各グループの平均をとる.

grouped_mean = df.groupby(['type','time']).mean()


df.pivot(1D→2D)

1次元配列を2次元配列にするイメージ

temp2d = df.pivot(index='y', columns='x', values='temp')


その他のTips


DataFrameの作成(辞書型)

ファイル以外からDataFrameを作る場合には,辞書を作って読み込ませる.

data = {'a':[0, 1], 'b':[2, 3]}

df = pd.DataFrame(data)

例:上の例にindexをつける場合

date = pd.date_range('2012-1-1', '2012-1-2', freq='D')

df = pd.DataFrame(data, index=date)


print時の折り返し幅の拡張

カラム数の多いデータフレームのprint時に表示が折り返されてしまうのが嫌な場合、表示幅を変更できる.

pd.set_option('display.width', 100)

or
pd.set_option('display.max_columns', 100) # カラム数でも制御できる

#pd.set_option('line_width', 100) # line_widthは非推奨or廃止(2018/05/06 Thanks to @dhwty)

print df # 100文字(or カラム)まで折り返されない


参考になるリンク