Edited at

ゆるふわPandasチートシート

More than 1 year has passed since last update.

よく忘れるので、自分用にざっくりとまとめてみました。


基本モジュールの読み込み

import pandas as pd

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


Pandasの表示に関わる基本設定

コマンド
説明

pd.options.display.max_columns = None
常に全ての列(カラム)を表示

pd.set_option('display.max_columns', None)
常に全ての列(カラム)を表示

pd.options.display.max_rows = 10
常に10行だけ表示

pd.options.display.precision = 2
表示用の有効桁数を2にする

pd.options.display.notebook_repr_html = True
データフレームをHTMLで綺麗に表示


Pandasのデータオブジェクト

コマンド
説明

pd.Series
インデックス付きの1次元データ(シリーズ)

pd.DataFrame
インデックス付きの2次元データ(データフレーム)

pd.Panel
インデックス付きの3次元データ(パネル)


データI/O

コマンド
説明

pd.read_csv('foo.csv', header=0)
CSVファイルからの読み込み

df.to_csv('bar.csv', index=False)
CSVファイルへの書き出し

pd.read_excel('foo.xlsx', sheetname='Sheet1')
エクセルファイルからの読み込み

df.to_excel('bar.xlsx', sheet_name='Sheet1')
エクセルファイルへの書き出し

pd.read_hdf('foo.h5','df')
HDF5ファイルからの読み込み

df.to_hdf('bar.h5','df')
HDF5ファイルへの書き出し


データを眺める


チラ見

コマンド
説明

df.head()
最初の5行を表示

df.tail()
最後の5行を表示


インデックス、カラム、値

コマンド
説明

df.index
インデックスを取得

df.columns
カラム名を取得

df.values
値をnumpy.ndarrayで取得


基本情報

コマンド
説明

df.info()
「有効データ数」「データ型」「メモリ使用量」などの総合的な情報を表示

df.shape
縦横の形を調べる

df.count()
各カラムの有効データ数を表示

df.dtypes
各カラムのデータ型を表示

len(df) - df.count()
すべてのカラムに対して、欠損値の数を計算


各種統計量

コマンド
説明

df.describe()
数値データに対して各種統計量を計算

df.describe(include='all')
全てのデータに対して各種統計量を計算


データの選択


カラムの選択

コマンド
説明

df['Age']
Ageをシリーズとして取得(キーワードアクセス)

df.Age
Ageをシリーズとして取得(ドットアクセス)


インデックスとカラムの同時選択

コマンド
説明

df[['Age', 'Name']][1:3]
位置番号 [1, 2]のAgeとNameカラムを取得

df.iloc[1:3, [0, 4]]
位置番号 [1, 2] or 真偽値リスト

df.loc[1:3, ['Age', 'Height']]
インデックス名 [1, 2, 3] or 真偽値リスト

df.ix[1:3, ['Age', 'Height']]
インデックス名 or 位置番号 or 真偽値リスト

df.iat[0, 1]
位置番号による高速な要素アクセス

df.at[1, 'Age']
インデックス名による高速な要素アクセス


真偽値インデックスによる選択

コマンド
説明

df[df.Age >= 70]
Ageが70以上の人を選択

df[df > 0]
0より上の要素はそのまま返し、それ以外はNaN

df.where(df > 0)
0より上の要素はそのまま返し、それ以外はNaN

df.mask(df > 0)
0より上の要素をNaNでマスクし、それ以外はそのまま返す

df.ix[:, df.columns.map(lambda x: x.startswith('A'))]
Aという文字から始まる列を取得

df[df['Grade'].isin(['A', 'B'])]
Gradeの値がAかBの行だけを返す

df.ix[:, ~df.columns.isin(['Age', 'Height'])]
AgeとHeight以外の列を全て返す


データの操作


基本操作

コマンド
説明

df.T
データフレームの転置

s.any()
ひとつでも真であればTrue

s.all()
すべて真であればTrue

s.astype('float64')
データ型の変換

s.map({'Female':0, 'Male':1, })
辞書を用いた値の変換

s.value_counts()
値の頻度を計算

pd.get_dummies(df['Club'])
カテゴリ変数をone-hotベクトルに変換

# カテゴリ変数をone-hot codingで離散化

colname = 'Category'
df_dummies = pd.get_dummies(df[colname], prefix=colname)
df.drop([colname], axis=1, inplace=True)
df = df.join(df_dummies)


インデックス関連

コマンド
説明

df.index = df.pop('UserId')
'UserId'というカラムをインデックスとして使用

df.reset_index(drop=True)
インデックスの振り直し


並び替え

コマンド
説明

df.sort_index(axis=1, ascending=True)
インデックスによる並び替え

df.sort_values(by='Age', ascending=False)
値による並び替え


コピー

以下の2つのコードの結果はまったく同じ。

# 変更したデータフレームを代入

df2 = df.sort_values(by='Age')

# コピーしたデータフレーム自体を変更

df2 = df.copy()
df2.sort_values(by='Age', inplace=True)


カラムの追加

# 方法1

df['AB'] = df['A'] + df['B']

# 方法2
df.loc[:, 'AB'] = df['A'] + df['B']


欠損値の処理


  • pandasは通常np.nanで欠損値を表現。これらの欠損値は計算時には基本的に無視される。

コマンド
説明

df.dropna()
欠損値がひとつでも含まれていたら、行を落とす

df.dropna(how='all')
すべての値が欠損していたら、行を落とす

df.fillna(0)
欠損値を0で埋める

df.fillna(method='ffill')
前の値で欠損値を埋める


削除

コマンド
説明

df.drop("Tmp", axis=1)
カラムの削除

df.drop_duplicated()
重複した行の削除


文字列メソッド

コマンド
説明

s.str.lower()
小文字に変換

s.str.startswith('A')
Aから始まるか検証

s.str.contains('^[Aa]')
正規表現を満たすかどうか検証

s.str.strip()
両端の空白文字を取り除く


カテゴリー関連

コマンド
説明

df['dcodes'] = df['d'].astype('category').cat.codes
カテゴリーごとに新規IDを振る


データの結合

コマンド
説明

pd.concat([df1, df2], axis=0)
行方向に結合

df1.append(df2, ignore_index=True)
行方向に結合。インデックスは振り直し。

df1.join(df2)
列方向に結合

pd.merge(df_left, df_right, how='inner', on='key')
SQLスタイルのマージ


グルーピング

Group byという操作は1つ以上の以下のステップを含む


  • Split: ある指標に基づき、データをグループに分割

  • Apply: グループごとにある関数を適用

  • Combine: 結果をまとめてデータ構造体に入れる

コマンド
説明

df.groupby(['A', 'B']).sum()
グルーピングした結果を足し合わせる

df.groupby(['A', 'B']).apply(lambda x: (x - x.mean()) / x.std())
グルーピングした結果をホワイトニング

df.groupby(['A', 'B']).agg(['mean', 'std'])
グルーピングした結果の平均と標準偏差を求める

df.pivot_table(values='D', index=['A', 'B'], columns=['C'], aggfunc=np.mean)
ピボットテーブルを作成


階層インデックス

コマンド
説明

df.stack()
カラムからインデックスへ

df.unstack()
インデックスからカラムへ

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz'],

['one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['A', 'B'])

df_stacked = df.stack()
df_stacked.index.names = ['first', 'second', 'third']


時系列データ


時系列データの基本処理

コマンド
説明

pd.date_range('20170101', periods=7)
2017年の元旦から7日間のタイムスタンプをインデックスとして取得

pd.to_datetime(s)
sをdatetimeに変換

ts.asfreq('5Min')
一定周期でスポットサンプリング(周期から値を1つだけ選択)

df[['A', 'B']]['2017-01-01':'2017-01-07']
2017年1月1日から2017年1月7日までのAとBに関するデータを取得

ts.asfreq('1T').ffill(limit=3)
1分ごとにスポットサンプリングし、欠損値は3ステップまで埋める

ts.resample('5Min').mean()
一定周期でリサンプリング(周期間の値をすべて使って演算)

df['A'].resample('3T', how=['mean', 'std', 'count'])
3分毎にリサンプリングしたデータに対し、各種統計量を求める

ts.at_time(datetime.time(18, 30))
18時30分のデータのみを取得。import datetimeを仮定

ts.pct_change()
変化量検出

ts.rolling(50).mean()
移動平均


タイムゾーン

コマンド
説明

ts_utc = ts.tz_localize('UTC')
時刻をUTC(協定世界時)に合わせる

ts_utc.tz_convert('US/Eastern')
US/Eastern(アメリカ東部標準時間)にタイムゾーンを変更

ts_utc.tz_convert('Japan')
日本標準時間にタイムゾーンを変更


参考資料