python基礎お勉強

ライブラリ

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 データの要約値を表示

列名変更

  • renameset_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として出力
    • よくある書き間違い
      • 行指定を忘れる
      • 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_elsecase_when のFALSEのときに処理は?
  • 正規表現を用いた列追加は可能?

結合

  • concatmerge がある
  • 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
    • 引数 howleft 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_onright_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()