LogoMark.png

Pandas のバックアップソース(No.1)

#author("2021-02-12T18:45:36+09:00;2021-02-09T18:05:17+09:00","default:inoue.ko","inoue.ko")
*Pandas
https://pandas.pydata.org/
~

Pandas は、データの読込、集計、並べ替え、欠損値の補完などを行うことができるライブラリで、データ分析の前処理段階で多く利用されます。.csv、.xlsx 他、多様な形式のデータを読み込みに対応しています。

PCのメモリ容量が許す限り、大量のデータを DataFrame に読み込んむことができ、表計算ソフトよりも高速で処理を行うことができます。

一般にこれを使う際は、まず Pandasでデータを整形した後、NumPyで数値計算を行う・・といった流れになります。

Pandas の特徴は ''DataFrame'' にあります。DataFrame にはデータの平均値や行数などの情報把握、並替え、列名変更といったデータ整形機能があります。

~
~


**準備
***インストール
[[Python]] 言語のライブラリとしてのインストールになるので、一般の Python3 の環境であれば、Terminalから以下のコマンドでインストールできます。
 $ pip3 install pandas
 $ pip3 list  ← 念のため一覧表示
~

***pandasを使った処理の冒頭部分の事例
 # 必要なライブラリのインポート
 import numpy as np
 import pandas as pd
 from pandas import DataFrame
 import matplotlib.pyplot as plt
~

***pandas による DataFrame の定義(構造の理解)
DataFrame は ''value''、''index''、''column'' の3つの要素から構成されます。
-value:個々のデータ値(行列データ)
-index:行を特定するための「行ラベル」
-column:列を特定するための「列ラベル」
 

以下、0から11までの数値を 3行・4列にあてはめて定義する事例
 df = pd.DataFrame( np.arange(12).reshape(3, 4),
        columns=['col_0', 'col_1', 'col_2', 'col_3'],
        index=['row_0', 'row_1', 'row_2'] )
 
 print(df)
 #           col_0  col_1  col_2  col_3
 # row_0      0       1        2         3
 # row_1      4       5        6         7
 # row_2      8       9       10        11
&small(df は DataFrame の略として一般によく用いられる名称です。);
~
~

**メソッド一覧

***データの読込
-CSV形式のデータの読込:read_csv()
 # iris.csv の読み込み
 df = pd.read_csv("/path/to/iris.csv")
-Excelファイルの読込:read_excel()
-JSON文字列の読込:read_json()
~

***データの情報把握
-データの特徴を表示:DataFrame.info()

-要約統計量を表示:DataFrame.describe()
以下のような統計量が一括表示されます。
--count:データ件数
--mean:平均
--std:標準偏差
--min:最小値
--max:最大値

-データの一部を表示:DataFrame.head()、DataFrame.tail()
-データの形状を表示:DataFrame.shape
-行数を取得:DataFrame.index.values
-列名を取得:DataFrame.columns.values
-それぞれの列の型を取得:DataFrame.dtypes
~

***printメソッドによる統計量の表示
 print("平均値:", df.mean() )
 print("中央値:", df.median() )
 print("分散:", df.var() )
~

***データのスライス・フィルタリング
DataFrame.iloc[ ]、DataFrame.loc[ ]、DataFrame[ ]、DataFrame.query()

-iloc属性によるスライス(行列の番号から)
--1行目・1列目のデータを抽出
 df.iloc[ 1 , 1 ]
--すべての行の 5列目 を抽出(「 : 」 は「すべて取り出す」の意味)
 df.iloc[ : , 5 ]

-loc属性によるスライス(index, column 名から)
--特定の index, column から抽出
 df.loc[ 1 , 'sepal_width' ]
--すべての行の sepal_width  を抽出(「 : 」 は「すべて取り出す」の意味)
 df.loc[ : , 'sepal_width' ] 

-データフレームから特定カラムを抽出
--species カラムのみを抽出
 df['species']
--複数のカラムを抽出
 df[ ['sepal_length' , 'sepal_width' , 'petal_length' , 'petal_width' ] ]

-queryによるフィルタリング
--species カラムの値が setosa のデータのみを取得
 df.query( "species == 'setosa' " )

~

***欠損値に関する処理
-欠損値の確認:DataFrame.isnull().sum()
 df.isnull().sum()

-欠損値のある行を削除:DataFrame.dropna()
 df = df.dropna( how='any' ) 
&small(※ how ='any' は欠損がひとつでもあれば、その行を削除);

-欠損値に値を埋める:DataFrame.fillna()
~

***データの並べ替え
-値による並べ替え:DataFrame.sort_values()
 # sepal_length の降順に並べ替え
 df.sort_values('sepal_length', ascending=False )
-インデックスによる並べ替え:DataFrame.sort_index()
~

***集計その他
-列の集計:DataFrame.value_counts()
-表の集計:DataFrame.groupby()
--groupby().sum():合計
--groupby().mean():平均

-クロス集計
--単純クロス集計
 pd.crosstab( df['カラム名1'] , df['カラム名2'] )
--正規化
 pd.crosstab( df['カラム名1'] , df['カラム名2'] , normalize='index' )


-列同士の相関を確認:DataFrame.corr()
  df.corr()  ← カラム数 x カラム数 のマトリックスとして得られます。

-列名の変更:DataFrame.rename()

-カテゴリー変数の展開:get_dummies()
~

***可視化
以下、Matplotlib の import が必要です。
 import matplotlib.pyplot as plt
~

-ヒストグラム:DataFrame.hist()
--すべての数値項目について一括表示
 df.hist( )
--生成される画像のサイズを 9インチ x 6インチに指定する場合 
 df.hist( figsize=(9, 6) )
--50件分表示の場合
 df[:50].hist( figsize=(9, 6) )
~

-グラフ:DataFrame.plot() &small(引数kindでグラフの種類を指定できます。);
 df.plot( kind='line' )
--line : 折れ線グラフ(line plot)
--bar : 垂直棒グラフ(vertical bar plot)
--barh : 水平棒グラフ(horizontal bar plot)
--box : 箱ひげ図(boxplot)
--hist : ヒストグラム(histogram)
--kde, density : カーネル密度推定(Kernel Density Estimation plot)
--area : 面グラフ(area plot)
--scatter : 散布図(scatter plot)
--hexbin : hexbin plot
--pie : 円グラフ(pie plot)
-棒グラフ:DataFrame.bar()
-箱ひげ図:DataFrame.boxplot()

~

**活用サンプル
以下に、Pandas によるデータ読み込みのサンプルを掲載しています。
ipynb(JupyterNotebook)形式で、GitHubに置いていますが、レンダリングがタイムアウトする場合は、下の nbviewer 経由でご覧下さい。

-GitHub:[[ReadDataSample.ipynb>https://github.com/koichi-inoue/JupyterNotebook/blob/master/ReadDataSample.ipynb]]
-nbviewer:[[ReadDataSample.ipynb>https://nbviewer.jupyter.org/github/koichi-inoue/JupyterNotebook/blob/master/ReadDataSample.ipynb]]
~
~

**参考:ライブラリのサンプルデータを読む事例
 # サンプルデータセットを取得
 from sklearn import datasets
 boston = datasets.load_boston()

 # 読み込んだデータを Pandas の DataFrame型に変換
 df = DataFrame(boston.data, columns = boston.feature_names)
 # 目的変数をDataFrameへ追加
 df['MEDV'] = np.array(boston.target)
~
~