Pandas は、データの読込、集計、並べ替え、欠損値の補完などを行うことができるデータ解析の定番ライブラリで、.csv、.xlsx 他、多様な形式のデータを読み込みに対応しています。大量のデータの読み込みに対応しており、表計算ソフトよりも高速で処理を行うことができます。
Pandas の特徴は DataFrame にあります。DataFrame にはデータの平均値や行数などの情報把握、並替え、列名変更といったデータ整形機能があります。
以下、公式のチートシートで全体像を把握できます。
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf
Pandasはインストール済みです。impot 文で呼び出すだけで使えます。
import pandas as pd
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つの要素から構成されます。
以下、DataFrame を扱う変数として df を使って事例を紹介します。
df は DataFrame の略として一般によく用いられる変数名です。
df = pd.DataFrame( [ [ '佐藤', 170, 60 ] , ['田中', 160, 50 ] , [ '鈴木', 165, 58 ] ] ) df
0 1 2 0 佐藤 170 60 1 田中 160 50 2 鈴木 165 58
行ラベル、列ラベル(index と columns ) には、自動的に番号数字が入ります。
df = pd.DataFrame( data =[ [ '佐藤', 170, 60 ] , ['田中', 160, 50 ] , [ '鈴木', 165, 58 ] ] , index = ['S01', 'S02', 'S03'], columns =[ 'name' , 'height', 'weight'] ) df
name height weight S01 佐藤 170 60 S02 田中 160 50 S03 鈴木 165 58
df = 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' ] ) df
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
0から11までの数値を 3行・4列にあてはめて定義する事例
df = pd.DataFrame( data = np.arange(12).reshape(3, 4), index = [ 'row_1', 'row_2', 'row_3' ], columns = [ 'col_1', 'col_2', 'col_3', 'col_4' ] ) df
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
df.describe( )データ件数、平均、標準偏差、最大・最小等の統計量が一括表示されます。
df.corr( )数値項目間の相関が、カラム数 x カラム数 のマトリックスで表示されます。
DataFrame.set_option( )
処理の実行後の表示では、行・列数が制限されていて、データ数が多い場合は、中途が・・・と省略表示になります。これを回避するためのメソッド。
pd.set_option( 'display.max_rows', 50 )
DataFrame.sort_values( ) , DataFrame.sort_index( )
# col_2 の降順に並べ替え df.sort_values( 'col_2', ascending=False )
# インデックスの降順に並べ替え(デフォルトは ascending = True ) df.sort_index( ascending = False )
DataFrame.rename( )
rename メソッドの引数 index および columns に、{ 元の値 : 新しい値 } のかたちで(辞書型の定義)で元の値と新しい値を指定します。デフォルトでは削除後の状態を返すだけで、元の DataFrame そのものを破壊・更新するわけではありません。引数 inplace = True にすると、元の DataFrame が変更されます。
df2 = df.rename( index={ 'row_1': 'ONE' } ) # 元の df は破壊されません。 df.rename( index={ 'row_1': 'ONE'} , inplace=True ) # df自体が更新されます。
df2 = df.rename( columns = { 'col_1' : 'A' } )
df2 = df.rename( index = { 'row_1' : 'ONE' } , columns = { 'col_1' : 'A' } )
df2 = df.rename( index = { 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 自体が更新されます。
df2 = df.drop( index = [ 'row_1' , 'row_3' ] )
df2 = df.drop( columns = 'col_2' )
df2 = df.drop( columns=[ 'col_1' , 'col_3' ] )
df2 = df.drop( index='row_3' , columns='col_2' )
DataFrame.isnull( ) , DataFrame.dropna( ) , DataFrame.fillna( )
実際のデータには、無回答や入力ミスなどで欠損値が発生することがあります。pandas では NaN(Not a Number:非数) と表記され部分が欠損値ですが、これは後の演算等でエラーを発生させる原因となるので、それを含む部分は除去することが必要です(データクレンジング)。
df.isnull( ).sum( )
df = df.dropna( how='any' )※ how ='any' は欠損がひとつでもあれば、その行を削除
DataFrame[ ]、DataFrame.iloc[ ]、DataFrame.loc[ ]
以下、いずれも抽出後の DataFrame を返しますが、元のデータフレームそのものが更新されることはありません(非破壊操作)。
df[ 'col_1 ' ] または df.col_1複数列の抽出
df[ [ 'col_2 ' , 'col_3 ' ] ]
df[ :3 ] # 0, 1, 2 行目が抽出されます特定区間を抽出
df[ 3:5 ] # 3, 4 行目が抽出されます
df.iloc[ 1 , 1 ]すべての行の 5列目 を抽出(「 : 」 は「すべて取り出す」の意味)
df.iloc[ : , 5 ]
df.loc[ 'row_1' , 'col_2' ]すべての行の col_2 を抽出(「 : 」 は「すべて取り出す」の意味)
df.loc[ : , 'col_2' ]
DataFrame.query( )
以下、いずれも抽出後の DataFrame を返しますが、元のデータフレームそのものが更新されることはありません(非破壊操作)。
df.query( 'height <= 170' )
df.query( 'A > B' )
df.query( ' name == "鈴木" ' )
df.query( ' 学部 == "芸術" and GPA >= 2.0 ' )
等 号:== 否 定:!= 不等号:< , > , <= , >= 論理積:and , & 論理和:or , |
DataFrame.value_counts( ) , DataFrame.sum( ) , DataFrame.mean( ), DataFrame.median( ) , DataFrame.var( )
df[ '学部' ].value_counts( ) # 全データ中の各学部の人数をカウント
df[ 'col_1' ].sum( ) # col_1列の合計 df[ 'col_1' ].mean( ) # col_1列の平均 df[ 'col_1' ].median( ) # col_1列の中央値 df[ 'col_1' ].var( ) # col_1列の分散
DataFrame.groupby( )
特定の列データの値を基準にグルーピングした上で、グループごとの統計処理を行うことができます。例えば、全学生の成績一覧がある場合に、学部ごとの成績の平均を求める・・といったことが可能です。
df.groupby( '学部' ).sum( ) df.groupby( '学部' ).mean( ) df.groupby( '学部' ).var( )
df.groupby( [ '学部' ,'性別' ] ).mean( ) # 各学部 X 性別ごとの平均
pandas.crosstab( )
2項目のカテゴリの組み合わせでサンプル数の算出ができます。
第一引数が index(行見出し)、第二引数が columns(列見出し)となる DataFrame が返されます。
pd.crosstab( df[ 'col_1' ] , df[ 'col_2' ] )
pd.crosstab( df[ 'col_1' ] , df[ 'col_2' ] , normalize='index' )
pandas.pivot_table( index = , columns = , values = , aggfunc = )
2項目のカテゴリの組み合わせで、データの統計量(平均、合計、最大、最小、標準偏差など)を確認・分析できます。
pivot_table = pd.pivot_table( df, index='学部', columns='性別' , values='成績' , aggfunc='mean' )学部 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" )
# サンプルデータセットを取得 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 )