- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-09-01T22:11:54+09:00;2021-08-26T16:52:52+09:00","default:inoue.ko","inoue.ko")
#author("2021-11-07T16:04:25+09:00;2021-08-26T16:52:52+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
~
~
**DataFrame
***pandas による DataFrame の定義
一般に、データフレームは CSV や Excel 等のデータを読み込んで生成するものですが(後述)、ここではデータフレームの構造を理解する意味で、直接的なデータの定義方法について紹介します。
pd.DataFrame( data, index, columns, dtype, copy)
DataFrame は ''data''、''index''、''columns'' の3つの要素から構成されます。
-data:個々のデータ値(行列データ)
-index:行を特定するための「行ラベル」
-columns:列を特定するための「列ラベル」
~
***定義例1:リストで要素を渡す方法
df1 = pd.DataFrame(
data={'col_1': [10, 20, 30, 40],
data={ 'col_1': [10, 20, 30, 40],
'col_2': [50, 60, 70, 80],
'col_3': ['a', 'b', 'c', 'd'] }
)
df1
col_1 col_2 col_3
0 10 50 a
1 20 60 b
2 30 70 c
3 40 80 d
&small(df は DataFrame の略として一般によく用いられる変数名です。);
~
***定義例2:2次元配列を使って定義する事例
df2 = pd.DataFrame(
data=np.array( [ [10, 20, 30, 40],
[11, 21, 31, 41],
[12, 22, 32, 42] ] ),
data=np.array( [ [10, 20, 30, 40], [11, 21, 31, 41], [12, 22, 32, 42] ] ),
index=['row_1', 'row_2', 'row_3'] ,
columns=['col_1', 'col_2', 'col_3', 'col_4']
)
df2
col_1 col_2 col_3 col_4
0 10 20 30 40
1 11 21 31 41
2 12 22 32 42
col_1 col_2 col_3 col_4
row_1 10 20 30 40
row_2 11 21 31 41
row_3 12 22 32 42
~
***定義例3:0から11までの数値を 3行・4列にあてはめて定義する事例
df3 = pd.DataFrame(
np.arange(12).reshape(3, 4),
index=['row_1', 'row_2', 'row_3'],
columns=['col_1', 'col_2', 'col_3', 'col_4']
)
df3
col_1 col_2 col_3 col_4
row_1 0 1 2 3
row_2 4 5 6 7
row_3 8 9 10 11
~
~
**基本的なメソッド
***データの読込
-CSV形式のデータの読込:read_csv()
# iris.csv の読み込み
df = pd.read_csv("/path/to/iris.csv")
-Excelファイルの読込:read_excel()
[[GoogleColaboratory]] で GoogleDriveにあるExcelファイルを読む事例
df = pd.read_excel('/content/drive/My Drive/path/to/sample.xlsx')
-JSON文字列の読込:read_json()
~
***データの情報把握
-データの特徴表示:DataFrame.info()
df.info()
-要約統計量の表示:DataFrame.describe()
df.describe()
データ件数、平均、標準偏差、最大・最小等の統計量が一括表示されます。
-相関行列の表示:DataFrame.corr()
df.corr()
-データの一部を表示: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.isnull().sum()
df.isnull().sum()
-欠損値のある行を削除:DataFrame.dropna()
df = df.dropna( how='any' )
&small(※ how ='any' は欠損がひとつでもあれば、その行を削除);
-欠損値に値を埋める:DataFrame.fillna()
~
***特定の行・列の削除
DataFrame.drop()
dropメソッドは、デフォルトでは削除後の状態を返すだけで、元のデータフレームそのものを破壊・更新するわけではありません。削除後の結果を利用するには、以下いずれかの方法を採用します。
1. 新たなデータフレームに削除後の結果を渡す
df2 = df.drop(・・・)
2. ''inplace=True'' として元のデータフレーム自体を更新する
df.drop(・・・, inplace=True )
***行・列名の変更
DataFrame.rename()
rename メソッドの引数 index および columns に、{ 元の値 : 新しい値 } のかたちで(辞書型の定義)で元の値と新しい値を指定します。デフォルトでは削除後の状態を返すだけで、元の DataFrame そのものを破壊・更新するわけではありません。引数 inplace = True にすると、元の DataFrame が変更されます。
//削除対象の指定には、以下のように2つの書き方が可能です(結果は同じ)。
// df.drop('行ラベル名')
// df.drop(index='行ラベル名')
-行名の変更
df2 = df.rename( index={'row_1': 'ONE'} ) # 元の df は破壊されません。
df.rename( index={'row_1': 'ONE'}, inplace=True ) # df自体が更新されます。
//行の削除は axis=0、列の削除は axis=1 で区別します。
//axis=0 がデフォルトなので、行の削除の場合はこれを省略できます。
// df.drop('row_2') # axis=0 は省略可能
// df.drop('col_2', axis=1)
-列名の変更
df2 = df.rename( columns ={'col_1': 'A'} )
-行・列まとめて変更
df2 = df.rename( index={'row_1': 'ONE'} , columns ={'col_1': 'A'} )
~
***行・列の削除
DataFrame.drop()
dropメソッドは、デフォルトでは削除後の状態を返すだけで、元のデータフレームそのものを破壊・更新するわけではありません。引数 inplace=True にすると、元の DataFrame が変更されます。
-特定行の削除の事例
df2 = df.drop( index='row_2' ) #元の df は破壊されません。
df.drop( index='row_2', inplace=True) #df 自体が更新されます。
-複数行の削除(リストで指定)の事例
df.drop( index=['row_1', 'row_3'], inplace=True )
df2 = df.drop( index=['row_1', 'row_3'] )
-特定列の削除の事例
df2 = df.drop( columns='col_2' ) #元の df は破壊されません。
df.drop( columns='col_2', inplace=True ) #df 自体が更新されます。
df2 = df.drop( columns='col_2' )
-複数列の削除(リストで指定)の事例
df.drop( columns=['col_1', 'col_3'], inplace=True )
df2 = df.drop( columns=['col_1', 'col_3'] )
~
***データのスライス・フィルタリング
DataFrame.iloc[ ]、DataFrame.loc[ ]、DataFrame[ ]、DataFrame.query()
***データの抽出
DataFrame[ ]、DataFrame.query()、DataFrame.iloc[ ]、DataFrame.loc[ ]
-iloc属性によるスライス(行列の番号から)
-行の抽出
-列の抽出
col_1 列の抽出
df[ 'col_1 ' ] または df.col_1
複数列の抽出
df[ [ 'col_2 ' , 'col_3 ' ] ]
-queryによるフィルタリング
col_2 列の値が 20 のデータを取得
df.query( " col_2 == '20' " ) 注) 左辺と右辺の表記の違いに注意
条件が複合する場合( AND:& , OR:| )
df.query( " col_1 == '20' " & " col_3 == '10' " )
-行・列の番号を利用した抽出( iloc属性の利用 )
1行目・1列目のデータを抽出
df.iloc[ 1 , 1 ]
すべての行の 5列目 を抽出(「 : 」 は「すべて取り出す」の意味)
df.iloc[ : , 5 ]
-loc属性によるスライス(index, column 名から)
特定の index, column から抽出
-index・column名を利用した抽出( loc属性の利用 )
1行目の sepal_width のデータを抽出
df.loc[ 1 , 'sepal_width' ]
すべての行の sepal_width を抽出(「 : 」 は「すべて取り出す」の意味)
df.loc[ : , '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.sort_values()
# sepal_length の降順に並べ替え
df.sort_values('sepal_length', ascending=False )
-インデックスによる並べ替え:DataFrame.sort_index()
~
***集計・相関 その他
-列の集計:DataFrame.value_counts()
-表の集計:DataFrame.groupby()
--groupby().sum():合計
--groupby().mean():平均
-クロス集計:DataFrame.crosstab()
--単純クロス集計
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 が必要です。> [[DataVisualization]]
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でグラフの種類を指定できます。);
-line : 折れ線グラフ(line plot)
df.plot( kind='line' )
-bar : 垂直棒グラフ(vertical bar plot)
-barh : 水平棒グラフ(horizontal bar plot)
-box : 箱ひげ図(boxplot)
-hist : ヒストグラム(histogram)
-kde, density : カーネル密度推定(Kernel Density Estimation plot)
-area : 面グラフ(area plot)
-scatter : 散布図(scatter plot)
df.plot(kind='scatter', x='item01', y='item02', alpha=0.5, figsize=(9, 6) )
-hexbin : hexbin plot
-pie : 円グラフ(pie plot)
~
//***棒グラフ:DataFrame.bar()
***散布図:DataFrame.plot.scatter()
df.plot.scatter(x='item1', y='item2')
~
***箱ひげ図:DataFrame.boxplot()
df.boxplot( column="item-x", by="item-y")
~
~
**活用サンプル
以下に、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)
~
~