ゆるふわPandasチートシート

  • 78
    Like
  • 0
    Comment

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

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

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') 日本標準時間にタイムゾーンを変更

参考資料