Pandas は、データの読込、集計、並べ替え、欠損値の補完などを行うことができるライブラリで、データ分析の前処理段階で多く利用されます。.csv、.xlsx 他、多様な形式のデータを読み込みに対応しています。
PCのメモリ容量が許す限り、大量のデータを DataFrame に読み込んむことができ、表計算ソフトよりも高速で処理を行うことができます。
一般にこれを使う際は、まず Pandasでデータを整形した後、NumPyで数値計算を行う・・といった流れになります。
Pandas の特徴は DataFrame にあります。DataFrame にはデータの平均値や行数などの情報把握、並替え、列名変更といったデータ整形機能があります。
Python 言語のライブラリとしてのインストールになるので、一般の Python3 の環境であれば、Terminalから以下のコマンドでインストールできます。
$ pip3 install pandas $ pip3 list ← 念のため一覧表示
# 必要なライブラリのインポート import numpy as np import pandas as pd from pandas import DataFrame import matplotlib.pyplot as plt
一般に、データフレームは CSV や Excel 等のデータを読み込んで生成するものですが(後述)、ここではデータフレームの構造を理解する意味で、直接的なデータの定義方法について紹介します。
pd.DataFrame( data, index, columns, dtype, copy)
DataFrame は data'、index、columns'' の3つの要素から構成されます。
df1 = pd.DataFrame( 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
df は DataFrame の略として一般によく用いられる変数名です。
df2 = pd.DataFrame( 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
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
# iris.csv の読み込み df = pd.read_csv("/path/to/iris.csv")
df = pd.read_excel('/content/drive/My Drive/path/to/sample.xlsx')
df.info()
df.describe()データ件数、平均、標準偏差、最大・最小等の統計量が一括表示されます。
df.corr()
print("平均値:", df.mean() ) print("中央値:", df.median() ) print("分散:", df.var() )
df.isnull().sum()
df = df.dropna( how='any' )※ how ='any' は欠損がひとつでもあれば、その行を削除
DataFrame.drop()
dropメソッドは、デフォルトでは削除後の状態を返すだけで、元のデータフレームそのものを破壊・更新するわけではありません。削除後の結果を利用するには、以下いずれかの方法を採用します。
1. 新たなデータフレームに削除後の結果を渡す
df2 = df.drop(・・・)
2. inplace=True として元のデータフレーム自体を更新する
df.drop(・・・, inplace=True )
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( columns='col_2' ) #元の df は破壊されません。 df.drop( columns='col_2', inplace=True ) #df 自体が更新されます。
df.drop( columns=['col_1', 'col_3'], inplace=True )
DataFrame.iloc[ ]、DataFrame.loc[ ]、DataFrame[ ]、DataFrame.query()
df.iloc[ 1 , 1 ]すべての行の 5列目 を抽出(「 : 」 は「すべて取り出す」の意味)
df.iloc[ : , 5 ]
df.loc[ 1 , 'sepal_width' ]すべての行の sepal_width を抽出(「 : 」 は「すべて取り出す」の意味)
df.loc[ : , 'sepal_width' ]
df['species']複数のカラムを抽出
df[ ['sepal_length' , 'sepal_width' , 'petal_length' , 'petal_width' ] ]
df.query( "species == 'setosa' " )
# sepal_length の降順に並べ替え df.sort_values('sepal_length', ascending=False )
pd.crosstab( df['カラム名1'] , df['カラム名2'] )
pd.crosstab( df['カラム名1'] , df['カラム名2'] , normalize='index' )
df.corr() ← カラム数 x カラム数 のマトリックスとして得られます。
以下、Matplotlib の import が必要です。> DataVisualization
import matplotlib.pyplot as plt
df.hist( )
df.hist( figsize=(9, 6) )
df[:50].hist( figsize=(9, 6) )
df.plot( kind='line' )
df.plot(kind='scatter', x='item01', y='item02', alpha=0.5, figsize=(9, 6) )
df.plot.scatter(x='item1', y='item2')
df.boxplot( column="item-x", by="item-y")
以下に、Pandas によるデータ読み込みのサンプルを掲載しています。
ipynb(JupyterNotebook)形式で、GitHubに置いていますが、レンダリングがタイムアウトする場合は、下の nbviewer 経由でご覧下さい。
# サンプルデータセットを取得 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)