妊婦がプログラマーになるまで

プログラミング未経験ワーママが産休からPythonで機械学習を学ぶ記録を記します。

Pythonライブラリ「pandas」とは?関数一覧(学習メモ)

Pythonライブラリ「pandas」について学んだことをメモします。
f:id:damion_n:20210913210948p:plain

pandas(パンダス)

csvファイルやExcelファイルデータの読み込み、並び替え、欠損値補完などができるPythonのライブラリ。数表および時系列データを操作するためのデータ構造と演算を提供する。

pandasのライブラリのインポートは、以下のように記述するのが一般的。
別名として、「pd」とする慣習がある。

import pandas as pd

pandasの2つのデータ構造、「Series」「DataFrame」とは

Pandas(パンダス)には2つの主要なデータ構造があり、Series(シリーズ)が1次元のデータDataFrame(データフレーム)が2次元のデータに対応する。



Seriesを定義する

基本的には以下のコードで定義する。

pd.Series (data=データの配列, index=インデックスの配列, name=列名)

Seriesの情報(形状、インデックス、値、要素の値)などは、次のコードで取得できる。
In[0]:

s1 = pd.Series([1, 2, 3])

print('s1:', s1, sep='\n') # s1自体
print('s1.shape:', s1.shape) # s1の形状
print('s1.index:', s1.index) # s1のインデックス
print('s1.values:', s1.values) # s1の値
print('s1[1]:', s1[1]) # s1の値

Out[0]:
s1:
0 1
1 2
2 3
dtype: int64
s1.shape: (3,)
s1.index: RangeIndex(start=0, stop=3, step=1)
s1.values: [1 2 3]
s1[1]: 2



変数の中には、値そのものではなく、値に対して、整数を割り当てたものもある。
例えば、男性が 0 で、女性が 1 や、 天気で、晴は 0、曇は 1、雨は 2 など。

こうした記号化した変数の値に対して、人間が分かりやすいように、1 であれば曇、と表示することができる。

In[0]:

df = pd.DataFrame([0, 1, 2, 1, 2, 2, 0]) # DataFrameの定義
df[0].map({0: '晴', 1: '曇', 2: '雨', }) # Seriesにするため、インデックス0を指定

Out[0]:
0 晴
1 曇
2 雨
3 曇
4 雨
5 雨
6 晴
Name: 0, dtype: object



DataFrameを定義する

データフレームにCSVファイルからデータを読み込むには、以下のようにpandas.read_csv() 関数を使う。

pandas.read_csv(
    CSVファイルのパス,
    sep=',', # 項目の分離付
    header=0, # ヘッダーの行番号(0相対)。ヘッダーなしのときは None
    nrows=None, # 先頭から、指定した行数だけ入力。すべてのときは None
    names=None, # [列名のリスト] で、列名を指定
    dtype=None, # {列名: データ型} で、指定列が指定したデータ型で読み込まれる
    encoding=‘utf-8’ # ファイルの文字コード
)

head関数

データ数が多い場合は、head関数により、先頭行から何行目までを表示する、ということが指定できる。
( )内に表示したい行数を入れる。何も入れないとデフォルトで5行表示される。

data.head()  # 最初の5件を表示

tail関数

head関数と同じように、こちらは最後から何行目までを表示する、ということが指定できる。
( )内に表示したい行数を入れる。何も入れないとデフォルトで5行表示される。

data.head(10)  # 最後の10件を表示

統計量を確認する関数

データ分析を行う前に、統計量の確認をする場合に用いる関数一覧を示す。
欠損値以外の行数や、合計値、平均値など、個別の関数が用意されている。

・count() 行数
・sum() 合計値
・mean() 平均値
・std() 標準偏差
・var() 分散
・min() 最小値
・max() 最大値

上記は個別に統計量を確認する関数だが、統計量のサマリーを表示する関数としてdescribe() 関数がある。

・describe() 統計量のサマリー表示

data.describe()

相関係数

変数間の相関係数は、 corr() 関数で出すことができる。回帰分析などでよく使う。
corr() 関数の結果は、相関行列で出力され、縦軸・横軸に変数が並び、その変数間の相関係数が一覧となっている。

data.corr()

データの取り出し

データ処理のために、特定の列を取り出すことがある。
その際、取り出す構造がデータフレームか、NumPy配列かによって、書き方が変わる。

データフレームとして取り出す場合は、辞書から値を取り出すイメージで以下のように記述する。
例:weatherというデータ変数から、pref_codeというデータの初めの5行を表示する。

weather['pref_code'].head()

NumPy配列として取り出す場合は、loc を使う。
例:weatherというデータ変数から、pref_codeという列データの初めの5行を表示する。

weather.loc[:, ['pref_code']].head()


locやilocを使うことで、要素を取り出せる。
基本的に、loc[インデックス名, カラム名] または、iloc[インデックス番号, カラム番号] として取得する。
例:14番目の行である「東京」のave_temp(平均気温)を指定して表示する。

weather.loc[14, 'avg_temp'] # 東京(14)の平均気温

例:3番目の行の、5番目の列を指定して表示する。

weather.iloc[3, 5]


query関数で、条件に合致したデータを取り出すこともできる。
例:wetherというデータ変数中の、ave_temp(平均気温)が18℃以上を表示する。

weather.query('avg_temp >= 18') # 平均気温が18度以上


idxmin()関数で最小値、idxmax()関数で最大値を取得できる。
例:weatherデータのすべての最小値を表示する。

weather.idxmin()

クロス分析

クロス分析とは、数あるデータの中から、2~3個のデータだけをピックアップし、それらの関係を見る分析。クロス分析では、pivot_table()関数を使い、ピボットテーブル(データ関係が見やすいシンプルな一覧)を表示できる。

DataFrame.pivot_table(
    values=None, # 集計対象
    index=None, # 行
    columns=None, #  列
    aggfunc='mean', # 集計関数
    fill_value=None, # 欠損値を置き換える値 
    margins=False, # 小計などの行や列を追加
    dropna=True, # NaNのある列を削除
    margins_name='All', #  margins=True のときの行や列名
)

例:weather2データ中の、symbol_weather(天気記号)ごとに、count(件数)とnp.mean(平均値)を出す。その際、小数点以下1桁で表示。

weather2.pivot_table(index='symbol_weather', aggfunc=('count', np.mean)).round(1)

データフレームの定義とデータの追加

列を追加するのは、Python辞書と同様に、列名をキーとして、辞書にリストを追加していくイメージ。 最初に、空のデータフレーム(インデックス指定)をつくり、そこに、新しい列を代入で追加していく。

# 列を追加していく場合
evaluation = pd.DataFrame(index=['評価値1', '評価値2', '評価値3', ])
evaluation
# 列を追加
evaluation['モデル1'] = ['値11', '値21', '値31', ]
evaluation['モデル2'] = ['値12', '値22', '値32', ]
evaluation

f:id:damion_n:20210915100447p:plain



行の追加は、列の追加に比べると、少し複雑。最初に、空のデータフレーム(カラム指定)をつくり、そこに、新しい行をappend() 関数で追加していく。 このとき、行となるのは、pandas の Series または、DataFrameとなる。1行ずつの追加と考えると、Series になる。
Series には、データフレームの列名のリストをインデックスに、また、データフレームのインデックスとして、name 引数に値を指定しておく。
name 引数を指定する必要がなければ、ignore_index=True を指定する。

# 行を追加していく場合
evaluation = pd.DataFrame(columns=['評価値1', '評価値2', '評価値3', ])
evaluation
# 行を追加
evaluation = evaluation.append(pd.Series(['値11', '値12', '値13', ], index=evaluation.columns, name='モデル1'))
evaluation = evaluation.append(pd.Series(['値21', '値22', '値23', ], index=evaluation.columns, name='モデル2'))
evaluation

f:id:damion_n:20210915100414p:plain




結合

SQLのように、データフレームを結合することができる。結合条件は、指定された列の値の一致による。SQLの結合と同様に、内部結合、外部結合(左、右、完全)が指定できる。
SQL:データベースを操作するための 言語。

DataFrame.merge(
    right, # 右側に結合するデータフレーム
    how='inner', # {'left', 'right', 'outer', 'inner'} ... 左外部結合、右外部結合、完全外部結合、内部結合
    on=None, # 結合する列名が同じときの列名
    left_on=None, right_on=None, # 結合する列名が違うときの左側と右側の列名
)

f:id:damion_n:20210915100654p:plain



ソート

データフレームをソートすることができる。 値をもとにソートするのが、sort_values()、インデックスをもとにソートするのが、sort_index()。

・値によるソート
sort_values() 関数により、値によるソートができる。キーが複数あるときは、by引数やascending引数をリストにする。

DataFrame.sort_values(
    by,  # ソートする列名/行
    axis=0, # ソートする軸
    ascending=True, # Trueのとき、昇順
    inplace=False,  # オリジナルの置き換え
    na_position='last', # NaNの位置
    ignore_index=False # Trueのとき、インデックスが [0, 1, 2, ...] に振りなおされる 
)

f:id:damion_n:20210915100925p:plain


・インデックスによるソート
インデックスによるソートも同様の方法。

DataFrame.sort_index(
    axis=0, # ソートする軸
    ascending=True, # Trueのとき、昇順
    inplace=False,  # オリジナルの置き換え
    na_position='last', # NaNの位置
    ignore_index=False # Trueのとき、インデックスが [0, 1, 2, ...] に振りなおされる 
    )

f:id:damion_n:20210915101107p:plain



欠損値の処理

欠損値は、何らかの原因で、欠落してしまったデータのこと。欠損値があると、正しくデータの分析ができないこともある。したがって、欠損値に対して、何かしらの処理が必要になる。処理としては、
・欠損値を含む行を削除(欠損値が特定列の場合も含む)
・欠損値を含む列を削除
・欠損値を穴埋めする
が挙げられる。

欠損値があるか確認するコード。

DataFrame.isnull()

isnull() の結果は、それぞれの要素が True/False になりますので、これと合わせて、sum() 関数を適用して、列ごとにNaNがいくつあるかを数えたりする。

DataFrame.isnull().sum()

f:id:damion_n:20210915101400p:plain



欠損値に対する処理として、欠損値のある行を削除/列を削除することもある。 ただし、単に削除するだけでは、データ分析する上で、データが不足する可能性もあるため注意。

DataFrame.dropna(
    axis=0,  # 軸
    how='any',  # 'any':NA値が存在する場合、その行または列をドロップ
                # 'all':すべての値がNAの場合、その行または列をドロップ
    thresh=None,  # 指定した数の非NaN値を確保
    subset=None,  # 特定の列(行)にNaNがある行(列)を削除する場合に指定
    inplace=False  # オリジナルを置き換えるかどうか
)

f:id:damion_n:20210915101539p:plain


特定の値で欠損値を穴埋めすることもできる。
DataFrame.fillna() を使う。 データの状態にもよるが、平均値や中央値での穴埋めや、欠損値のある行の前後の値での穴埋めができる。

DataFrame.fillna(
    value=None,  # 特定の値を指定: すべて同じ値
                 # 辞書を指定: 列ごとに値を指定
                 # mean()などのメソッドを使うと、列ごとの平均値で置き換え
    method=None,  #  {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 
    axis=None, 
    limit=None, 
    inplace=False
)

・backfill: : 後ろの値で置き換え
・bfill: : 後ろの値で置き換え
・ffill: : 前の値で置き換え
・pad: : 前の値で置き換え

f:id:damion_n:20210915101759p:plain




押していただけると励みになります!

にほんブログ村 資格ブログ スキルアップへ
にほんブログ村