LoginSignup
990

More than 5 years have passed since last update.

ゆるふわPandasチートシート

Last updated at Posted at 2016-12-05

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

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

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

参考資料

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
990