今回はデータ加工に使えるpandasの機能を紹介する。kaggleを含め、機械学習のデータ加工はpandasでの加工が多い。
理由は単純にpandasはデータ加工において、扱いやすいから。今回はxgboostの特徴量を加工する機会があった。そのときに使ったり、調査したkaggleで人気なpandasのメソッドの中で使えそうなやつをまとめた。
機能1〜5まではここではirisデータセットで試した。
iris = datasets.load_iris() df_feature_iris = pd.DataFrame(iris['data'],columns=['sepal_length','sepal_width','petal_length','petal_width']) df_species_iris = pd.DataFrame(iris['target'],columns=['species']) df=df_feature_iris df.head()
用語について
pandasで使う用語で
・行
・列
がある。pandasは行列のmatrix形式で扱ので、ググればすぐわかるが、
行=>縦
列=>横
と考えると分かりやすい
行が横方向にならんだものを示し、列が縦方向にならんだものを示す。表計算ソフトでも、横方向を行と言い、縦方向を列と言う(参考Wikipedia)
pandas機能(1~19)
機能1
==行の複数条件指定==
これは列の内容で2つ以上の条件を指定する方法。
・純粋に&で指定するもの
・SQLのクエリのように指定する方法
の2つがある。クエリライクのやり方はkaggleで人気
df[(df['sepal_length']>=7)&(df['sepal_width']>=3)] #またはクエリのように指定する方法 df.query("sepal_length>=7 and sepal_width>=3")
機能2
==特定の型の列のみ取得==
列方向で特定のデータ型の値を取得する
pandasの場合、データ型は「整数('int')・小数('float')・真偽値('bool')」以外は全て「’object'」で指定
df.select_dtypes(['float']).head()
機能3
==列Aごとに列Bを集計する==
列Aのグループを作り、その値内で、列Bの値の数を集計する。
→irisデータで試す
'sepal_length'の列でグループを作り(4.3〜7.9)、'sepal_width'の値(2.0~4.4)を
値ごとに集計
df.groupby('sepal_length')['sepal_width'].value_counts().unstack().head()
‘sepal_length'が4.5で'sepal_width'が2.3の数=>1
機能4
==2つの列A、Bに着目し、3つ目の列Cの値を集計する==
これはわかりにくいので、irisデータで試した。
'sepal_length'でグループを作り(4.3〜7.9)、'sepal_width'の値(2.0~4.4)に
該当する'petal_length'の平均値を集計
df.pivot_table(index='sepal_length', columns='sepal_width',values='petal_length', aggfunc=np.mean).head()
‘sepal_length'が4.5で'sepal_width'が2.3の'petal_length'の平均値は1.3
機能5
==特定の型の削除==
「整数('int')・小数('float')・真偽値('bool')、それ以外(’object')」を指定して削除
df.select_dtypes(exclude=np.int)
機能6
==全列の欠損値カウント==
欠損値(Nanのデータ)を数える
print(df.isnull().sum())
機能7
==欠損値の値を置換==
欠損値を別の値に置換する。
例:欠損値を0に置換
df=df.fillna(0)
機能8
==標準化==
データを機械学習のモデルに読み込ませるとき、正規化(標準化)することが多いので、その手法の一つが標準化
numpyとかでもできるが、今回はScikit-learnを使った。
正規化=>データ等々を一定のルール(規則)に基づいて変形し、利用しやすくすること。
標準化=>元データを平均0、標準偏差が1のものに変換する正規化法の一つ
# 標準化 from sklearn.preprocessing import StandardScaler sc = StandardScaler() dff = sc.fit_transform(df) dff=pd.DataFrame(dff) # 列名を元に戻す listed=list(df.columns) dff.columns = listed
機能9
==行列内の文字列の末尾のN個削除 (’iraidate'は列名)==
列の文字列の末尾のN個の文字を削除する
b=[] for i,v in f2.iterrows(): b.append(str(v['iraidate'])[:3]) # bのDataFrame作成 f=pd.DataFrame(b, columns=['iraidate']) # 前の同じ行削除 df=df.drop("iraidate", axis=1) # 横に連結してもとに戻す df=pd.concat([df, f], axis=1)
機能10
==データの散布図==
Dataframe(df)とplotしたい列名2つを指定
sns.jointplot('kaiin_id','safety_tesuryo', data=df)
pandasデータの散布図の可視化に便利
あとはそのまんまの機能(機能11〜19)
・全列の名前表示
df.columns
・列名の変更
df=df.rename(columns={'last_login_year_cnts1': 'last_login_year_cnt1'})
・列の削除
df=df.drop('列名', axis=1)
・列名の一括変更(df_colum_listに全列名を入れておく)
df.columns=df_colum_list
・地味に全列名の一括変更
df=df.ix[:,['A','B','C']]
・縦にDataFrame(df)を連結
df=pd.concat([df, df2])
・横にDataFrame(df)を連結
df=pd.concat([df, df2], axis=1)
・list(listed)から列名付きで、DataFarame(df)作成
df=pd.DataFrame(listed, columns=['列名'])
・DataFrame(df)をcsvに保存/読み込み
# 保存 df.to_csv('feature.csv') # 読み込み df=pd.read_csv('feature.csv')
備忘録もかねてpandasの機能をまとめてみた。使えるものも多いと思うので、気に入ったらストックしておきたい。