ライブラリ
import pandas as pd import numpy as np
データロード
from sklearn.datasets import load_iris iris = load_iris() X = pd.DataFrame(iris.data, columns=iris.feature_names) y = pd.Series(iris.target) # X = pd.DataFrame(iris['data'], columns=iris['feature_names']) でも可 # y = pd.Series(iris['target']) でも可
データの確認
head
columns
keys
type
describe
をよく使うhead
tail
いわずもがなcolumns
keys
データの列名やキー名を表示type
データの型を表示describe
データの要約値を表示
列名変更
rename
とset_axis
があるrename
- 特定列だけ列名変更 する仕様
- 変更前と変更後の列名 を明示する必要アリ
X.rename(columns={'sepal length (cm)':'sepal_length'})
set_axis
- 全列で列名変更 する仕様
- 変更後の列名だけ を明示する必要アリ
- 注意点
labels
通りに列名変更されるため、columns
であらかじめ列順を確認せよ- 列名変更のほか行名変更もできてしまうので 、
axis=1
で列方向を指定せよ
X.set_axis(labels=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], axis=1)
- 一部の列名だけ変更したいなら
rename
- まとめて全列名を変更したいなら
set_axis
列選択
[ ]
loc
iloc
drop
del
がある[ ]
- かっこ内で選択したい列名を記入
- 1つ変数を列選択する場合
data['row_name']
(Seriesとして出力)data[['row_name']]
(DataFrameとして出力)
- 2つ以上の列選択の場合
data[ ['row_names1', 'row_names2', etc] ]
(DataFrameとして出力)
x1 = x['sepal_length'] x2 = x[['sepal_length']] x3 = x[['sepal_length', 'sepal_width']] type(x1) type(x2) type(x3)
loc
- 行と列の両方で選択範囲を指定
- 行:行名 or 行番号で指定
- 行番号はスライス
start:end
で指定可能 - 行番号を
:
と書くと全行指定となる
- 行番号はスライス
- 列:列名で指定
- 列番号で指定できない
- `loc[:, ['column']] とするとSeriesとして出力
- `loc[:, 'column'] とするとData.Frameとして出力
- 行:行名 or 行番号で指定
- よくある書き間違い
- 行指定を忘れる
loc[]
ではなくloc()
と書いてしまう
- 行と列の両方で選択範囲を指定
x1 = x.loc[:, 'sepal_length'] x2 = x.loc[:, ['sepal_length']] x3 = x.loc[:, ['sepal_length', 'sepal_width']] type(x1) type(x2) type(x3)
iloc
loc
と違うのは、列番号で列選択する点のみ
drop
- 削除したい列を列名で選択
- 行番号で削除したいときは、
columns
を利用して削除したい列番号の列名を取り出す
X.drop(['sepal_length'], axis=1) X.drop(X.columns[[1]], axis=1)
del
- こいつはいったんパス
正規表現で列名選択は可能?
行選択
[ ]
query
loc
がある[ ]
- 条件式でブール値を返して、そのブール値で行選択
- 条件式間は
&
|
でつなぐ - between表現はないので、betweenと同等の条件式を書くしかない
X[X.sepal_length >= 5.0] x[(x.sepal_length >= 1) & (x.sepal_length <= 5)] X[(X.sepal_length >= 5.0) & (X.pelat_width> 2.0)]
query
- 条件式内は
==
!=
<
>
=
でつなぐ - 条件式間は
and
or
でつなぐ - between条件は
num < column < num
などの書き方でOK
- 条件式内は
X.query('sepal_length >= 5.0') X.query('1 <= sepal_length <= 5.0') X.query('sepal_length >= 5.0' and 'petal_width >= 2.0')
loc
- 条件式を行成分に書けばよい
- 条件式間は
&
|
でつなぐ - between表現はないので、betweenと同等の条件式を書くしかない
X.loc['sepal_length >= 5.0'] X.loc[('sepal_length' >= 5.0) & ('petal_width' >= 1)]
- 正規表現で文字列の行選択は可能?
- 欠損値のみ/以外の行選択は可能?
列追加
[ ]
とassign
がある[ ]
- data[colname] = 数式で新しい列を生成
x['new_col1'] = x['sepal_length']
assign
- 列名 = 数式 で新しい列を生成(dplyr::mutateとほどんど同じ)
- lamda式を数式に使用可能
- maskで処理の条件変化を数式に組込可能(dplyr::case_whenとほとんど同じ)
x.assign(new_col1=x.sepal_length, new_col2=lambda x: x.sepal_length.round(), new_col3=lambda x: x.sepal_length.mask(x.sepal_width < 1, np.nan))
- **
if_else
やcase_when
のFALSEのときに処理は? - 正規表現を用いた列追加は可能?
結合
concat
とmerge
があるconcat
merge
raw_data2 = pd.DataFrame( [[1, 2, 3], [3, 4, 5], [4, 5, 6]], columns = ['a', 'b', 'c'] ) d_assigned = raw_data2.assign(d = pd.Series([2, 3, 5])) print(tmp2)
raw_data1 = pd.DataFrame( [[1, 2, 3], [3, 4, 5], [4, 5, 6]], columns = ['a', 'b', 'c'] ) print(raw_data1) raw_data1['d'] = [2, 3, 5] print(raw_data1)
データの並べ替え
X.sort_values('sepal length (cm)', ascending=True) X.sort_values('sepal length (cm)', ascending=False)
データの結合
merge
のデフォルトはinner_join
- 引数
how
でleft
right
outer
指定可能
- 引数
# %% d_score = pd.DataFrame( { 'user':[1, 2, 3], 'score':[100, 20, 55] } ) d_user = pd.DataFrame( { 'user':[1, 2, 3, 4, 5], 'name':['a', 'b', 'c', 'd', 'e'], 'class':['A', 'A', 'A', 'B', 'B'] }, columns=['user', 'name', 'class'] ) d_score_user = pd.merge(d_score, d_user, on = 'user')
- joinするkeyがデータフレーム間で違う場合
- 引数
left_on
とright_on
でそれぞれのデータフレームのjoin keyを指定 - あらかじめ
rename
でjoin keyを同じ名前にしておく
- 引数
# %% d_score = pd.DataFrame( { 'user_id':[1, 2, 3], 'score':[100, 20, 55] } ) d_user = pd.DataFrame( { 'user':[1, 2, 3, 4, 5], 'name':['a', 'b', 'c', 'd', 'e'], 'class':['A', 'A', 'A', 'B', 'B'] }, columns=['user', 'name', 'class'] ) d_score_user_2 = pd.merge(d_score, d_user, left_on = 'user_id', right_on = 'user')
# %% d_score_rename = d_score.rename(columns={'user_id':'user'}) d_score_user_3 = pd.merge(d_score_rename, d_user, on = 'user')
グループごとで集計
# %% df = pd.concat([X, y], axis=1) df = df.rename(columns={0:'species_id'}) df.groupby('species_id').mean()