Dataquest
2-1 Pandas and NumPy Fundamentals
Introduction to NumPy
NumPy はデータを ndarray(n-dimensional array)で持っている
data_ndarray = np.array([10, 20, 30])
- なぜ ndarray が分析を楽にするのか
- CPU の SIMD(Single Instruction Multiple Data)を使って高速に計算できるから
- このように複数のデータを一度に操作することを Vectorization(ベクトル化)という
Exploring Data with pandas: Fundamentals
- ベクトル計算のメリット
- パフォーマンスに優れる
- 計算処理の記述が簡素になる (
series_a - series_b
など)
- 統計関数を使うと便利
(dataframe|series).max()
(dataframe|series).min()
(dataframe|series).mean()
(dataframe|series).median()
(dataframe|series).mode()
(dataframe|series).sum()
series.value_counts()
--- ユニークな値とその出現数を取得するseries.describe()
--- 統計情報を取得する- null でない値の個数
- 平均、最大値、出現頻度など
Exploring Data with pandas: Intermediate
- 明示的に NaN をセットしたいときは
np.nan
を使う - インデックス列を列番号で指定する方法
pd.read_csv('some.csv', index_col=0)
- 指定しなければ連番がセットされる
- インデックス「名」を削除する
df.index.name = None
- インデックス|カラムによる選択を行う
df.loc[]
- 位置による選択を行う
df.iloc[]
- null であるものを抽出する
df.isnull()
df.notnull()
series.isnull()
series.notnull()
- boolean index を組み合わせて使う
is_john = df['name'] == 'john'
adult = df['age'] > 18
df[is_john & adult] # and
df[is_john & ~adult] # not
df[is_john | adult] # or - 並べ替える
df.sort_index(ascending=False)
df.sort_values('age', ascending=False)
- ユニークな値を配列として取得する
df['firstname'].unique()
Data Cleaning Basics
データを俯瞰する
まずdf.info()
により、カラム名、格納されているデータの数と種類などを俯瞰する
カラム名を整理する
カラム名の変更はdf.columns
を置き換えることにより行う
- 記号を削除するか置き換える ---
str.replace()
- 先頭・末尾のスペースを削除する ---
str.strip()
- スペースをアンダーバーで置き換える ---
str.replace()
- 大文字を小文字にする ---
str.lower()
- 長い名前を短い名前にする ---
str.replace()
データの俯瞰
df.describe()
で統計情報を俯瞰したうえで下記を抽出する- 数値がテキストとして格納されていないか --- あれば修正する(後述)
- 値が 1 種類しかない無用な列はないか --- あれば削除を検討する
df.drop(['colname'], axis=1)
- より詳しい調査が必要な列はどれか --- あれば調査する
必要に応じて文字列列を数値列にする
- 列ごとに値のパターンと例外を調べる
Series.dtype
Series.unique()
- non-digit な部分を取り除く
- Vectorized string methodを用いて行う
Series.str.replace('GB','')
など
- 型を変換する
Series.astype(float)
- 必要に応じてカ ラム名を変更する(各セルに含まれていた
GB
のような単位情報を付与するなど)df.rename({'ram':'ram_gb'}, axis='columns', inplace=True)
文字列列を整理する
- 必要があれば文字列の一部を使って新しい列を作成する
# `cpu`列に`Intel Core i5 2.3GHz`のような値が格納されている場合
laptops["cpu_manufacturer"] = (
laptops["cpu"].str.split().str[0]
) - 表記のゆらぎを修正する
s.value_counts()
s.map({'wrong': 'correct'})
--- マップにはすべての値を含める必要があるので注意する
- 文字列の一部を抜き出す
2016-03-26 17:47:46
という形式の列から日付を抜き出すにはautos['date_crawled'].str[:10]