アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

列名とかデータ加工に使うpandasの便利な機能まとめ (python・機械学習)

今回はデータ加工に使える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()

f:id:trafalbad:20180816122129p:plain

用語について

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
f:id:trafalbad:20180816122214p:plain




機能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
f:id:trafalbad:20180816122325j:plain



機能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の機能をまとめてみた。使えるものも多いと思うので、気に入ったらストックしておきたい。