pandas

pandasとは、データ分析・解析用のライブラリ

pandasの特徴:numpyでやったことを見やすくわかりやすく表示できる

       グラフ、表

 

Seriesの作成

numpyにおけるアレイみたいなもの

1次元のデータ

 

import numpy as np      #numpyとpandasをインポート

import pandas as pd

 

S1 = pd.Series(np.arange(4)) #Seriesを生成 4要素のアレイを作る

 

S1

out:0    0   #1列目がインデックス 2列目が値

      1    1

      2    2

      3    3

    dtype: int32

 

S1.index    #インデックスを調べる

out:RangeIndex(start=0, stop=4, step=1)

 

S1.values    #値を調べる

out:array([0, 1, 2, 3])

 

S1[0]    #インデックス0の値を調べる

out:0

 

S1?   #こうするとタイプが見れる Seriesになっていることを確認できる

Type:        Series

 

 

#インデックスにキーワードを指定してSeriesを生成する

S2 = pd.Series([1,2,3,4], index = ["a","b","c","d"])

S2

out:a    1

      b    2

      c    3

      d    4

      dtype: int64

 

S2["a"]  #値にアクセスするにはキーワードを指定する

out:1

 

#Seriesをリストに変換する(キーワードは失われる)

list(S2)   

out:[1, 2, 3, 4]

 

#ディクショナリをSeriesに変換する

pd.Series(num_dict)

 

out:a    1

      b    2

      c    3

    dtype: int64

 

#Seriesに要素を追加する方法

S3 = pd.Series([])       #空のSeriesを作って

S3["a"] = 1     #キーワードと値を指定

S3

out: a    1

   dtype: int64

 

Data frameの作成

Seriesは1次元のデータ

DataFrameはスプレッドシートのような2次元のデータを扱う

 

import pandas as pd       #pandasと

import numpy as np   #numpyをインポート

 

df1 = pd.DataFrame(np.arange(9).reshape(3,3))  #PandasのDataFrameをnpのarangeで作る

df1                      #3×3にReshapeする

    #このようにスプレッドシート風に出力される

             #インデックスを渡さないとこのように数字になる

               #行番号がインデックス、列番号がカラムズ

 

#インデックスを指定する方法

df2 = pd.DataFrame(np.arange(9).reshape(3,3), index=["a","b","c"], columns=["X","Y","Z"])

df2

     #このようにインデックスとカラムズを指定できる

 

#特定の列を取り出す

df2["X"]

 

#空のDataFrameを作成して、後から要素を追加する方法

df3.ix["a","A"] = 1        #エラーになる 最近はixは使わず、ilocを使うそうです。

 

             #解説はまたの機会に

 

txt, csv, Excelファイルからの入出力

import numpy as np   #numpyと

import pandas as pd   #pandasをインポート

 

#Excelファイルをインポート

df_p = pd.read_excel("./Lecture_Python\physical_measurement.xlsx") 

            #カレントディレクトリ配下がよい 

df_p.head()    #head関数を使うと最初の5行だけ表示される

    #正しく読み込まれていることを確認

 

 

#データをファイルを書き出す

#CSVは .to_csv

df_p.to_csv("./Lecture_Python\sample.csv", sep=",") #セパレータを,に指定

#Excelは .to_excel

df_p.to_excel("./Lecture_Python\sample.xlsx") 

  

Dataflameの操作【取得】

import numpy as np   #numpyと

import pandas as pd   #pandasをインポート

%matplotlib inline    #グラフ描画をNotebook内でしてくれるおまじない


#データフレームを作ってみる
df1 = pd.DataFrame(np.arange(9).reshape(3,3), index = ["a","b","c"], columns = ["A","B","C"])
df1

#値を取り出す

df1.values

array([[0, 1, 2],

         [3, 4, 5],

 

         [6, 7, 8]])

 

 

#インデックスを取り出す

df1.index

Index(['a', 'b', 'c'], dtype='object')

 

#カラムズを取り出す

df1.columns

Index(['A', 'B', 'C'], dtype='object')

 

#カラムズを取り出す

df1.columns[0]

'A'

 

#Shapeを確認する

df1.shape
(3, 3)

 

Excelを読み込む

df2 = pd.read_excel("./physical_measurement.xlsx")

df2  #読み込まれているか確認


df2.head(3)     
#最初の3行だけ出力される

df2.tail(3)         #最後の3行だけ出力される

 

#身長だけを取り出す

df2["height"]

 

#平均値を出す

df2["height"].mean()
159.01231356018485

 

#身長170㎝を超えているデータだけを抽出する

df2[df2["height"]>170]

 

#女性だけのDataFrameを作る

df_f = df2[df2["sex"] == "female"]

 

ヒストグラムを描く

#身長のヒストグラムをビンズを15個で描く

df_f[df_F["height"].hist(bins=15)

 

 

dataframeの操作【インデックス】

import pandas as pd   #パンダスとナムパイをインポート

import numpy as np


df1 = pd.DataFrame(np.arange(16).reshape(4,4)) #16コマのarangeを4×4にリシェイプ
df1

#何も指定しないと数字のインデックスとカラムズになる

#これをリネームする

df1.rename(index={0:"A",1:"B",2:"C",3:"D"}, columns={0:"weight",1:"height",2:"grade",3:"sex"})

#この状態では保存されていないので、df2など新しいDataFrameに格納する
df2 = df1.rename(index={0:"A",1:"B",2:"C",3:"D"},
   columns={0:"weight",1:"height",2:"grade",3:"sex"})

並べ替え

#カラムズをリネームする
df2.reindex(columns=["height","weight","sex","grade"])


#こちらも保存するために別のDataFrameに格納する

 

値の取り出し

#カラムズ名で指定する方法

df2["height"]

 

#番地で指定する方法

df2.iloc[:,1]   #すべての行「:」と1列目で指定

  #同じ結果が得られる

 

Dataframeの操作【変更】

#numpyとpandasをインポート

import numpy as np   

import pandas as pd

 

#Excelファイルを読込んでデータフレームに入れる

df = pd.read.excel("physical_measurement2.xlsx",index_col=0)

#その際、index_col=0 という引数を入れることでインデックス列がつかず最初のカラムがインデックスとなる。特定のカラムをインデックスにしたければその列を指定する。

 

df .heas(10)      #10行 表示する

 

#インデックスのソートを行う

df .sort_index()

 

#df2として保存

df2 = df .sort_index()

 

#NaN(Not a number)を削除

df2.dropna()        #Na値を削除

 

#NaN(Not a number)を特定の値に置換

df2.fillna(value=-1.0)    #NaN値は一律 -1.0に置換

 

 

#NaN値を直前の値に置換

df2.fillna(method="ffill")     #直前の値が適用される

 

#NaN値を平均値に置換する

df3 = df2.fillna(value=df2.mean())

#df3として保存

 

#重複値を削除する

df3.drop_dupulicates()      #インデックスが重複するレコードを削除

 

#文字列のsexを分析しやすく数値に置換する

#sex2というカラムを作り、そこにラムダ式でmaleだったら1、そうでなければ-1を代入する

df4["sex2"] = df4["sex"].apply (lambda x :np.where(x == "male" ,1 ,-1))

df4

 

#sexのカラムが不要になったので削除する

dell df4["sex"] 

df4