ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

チュートリアル拾い読み (6):Pandas公式チュートリアル (1/7) [Python]

Rもたいして使いこなせてないのにPythonの勉強を始めてみました。色々と素晴らしいチュートリアルはありそうですが、目移りしてしまうので公式チュートリアルを拾い読みしていきます。

NumPyが終わって今回からはPandasに入りますが、導入版(Intro to pandas)・簡易版(10 minutes to pandas)は物足りなず、本格版(User guideのIntro to data structures以降)は読みきれなかったので、チートシート(PDF)を中心に読んでいきます。

前回:

necostat.hatenablog.jp

Pandasライブラリで扱うもの

Pandasでは表形式のデータを扱います。実際に解析で使うデータシートを読み込んで、整形して、必要なら書き出すというところが中心になります。 それぞれの処理が必要になる状況がNumpyよりも想像しやすいので、モチベーションは保ちやすいですね。

DataFrameとは

PandasではDataFrameという形式の2次元データテーブルを扱います。これは各観察単位(observation)が同じ行(row)に、各変数(variable)が1つの列(column)に整然と並べられて保存されているものです。

チュートリアルではSeriesという1次元データの形式も説明されていますが、実際の作業ではあまり意識することはないので、拾い読みでは割愛します。

DataFrameの作り方

チュートリアルでは色々紹介されていますが、辞書(dictionary)から作る方法と配列(array)から作る方法だけ知っておけば事足りそうです。

辞書から作る

まずPandasライブラリ(ついでにNumpyも)を読み込みます。通常はpdという名前で呼び出します。

import pandas as pd
import numpy as np

Dataframe( )という関数に辞書形式のデータを渡します。このときにインデックスindexも指定しておきます。指定しないと0から始まる連番が振られます。

df = pd.DataFrame(
    {"a":[10,20,30],
     "b":[40,50,60],
     "c":[70,80,90]},
    index = [1,2,3]
)

変数aは10,20,30、変数bは...という要領で、各変数の値を指定していきます。各変数の長さが異なっているとエラーが出ます。

print(df)で確認すると次のとおり。

# 出力:
    a   b   c
1  10  40  70
2  20  50  80
3  30  60  90

配列から作る

今度はDataFrame( )に配列を渡します。列名はcolumnで与えます。

df = pd.DataFrame(
    [[10,40,70],
     [20,50,80],
     [30,60,90]],
    index = [1,2,3],
    columns = ["a","b","c"]
)

確認すると、

# 出力:
    a   b   c
1  10  40  70
2  20  50  80
3  30  60  90

csvデータの読み込み

実際には辞書データや配列データから作る機会はチュートリアル以外にあまりなく、csvファイルとして読み込むことがほとんどです。

例として、あやめの花びら・がく片の長さと幅を含んだirisデータセットを使います。このデータセットはPythonのscikit-learnやseabornといったライブラリに含まれていて、直接呼び出すこともできるようですが、自分のcsvデータを読み込んで解析したいケースが多いと思うので、csvデータをダウンロードしてから読み込みます。

seabornのgithubにcsvデータがありました。

github.com

これをread_csv( )関数を使って読み込みます。上記のコードで、現在プログラムを実行しているディレクトリを確認し、そこにiris.csvという名前でデータを置いているとします。

import os
os.getcwd()
iris = pd.read_csv("iris.csv")

ディレクトリがいまいち分からないけど、とりあえず先に進みたい人は、下のコードでgithubに置いてあるデータを直接読み込むこともできます。

iris = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv")

確認してみましょう

print(iris)
# 出力:
     sepal_length  sepal_width  petal_length  petal_width    species
0             5.1          3.5           1.4          0.2     setosa
1             4.9          3.0           1.4          0.2     setosa
2             4.7          3.2           1.3          0.2     setosa
3             4.6          3.1           1.5          0.2     setosa
4             5.0          3.6           1.4          0.2     setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  virginica
146           6.3          2.5           5.0          1.9  virginica
147           6.5          3.0           5.2          2.0  virginica
148           6.2          3.4           5.4          2.3  virginica
149           5.9          3.0           5.1          1.8  virginica

ちゃんと読み込めているようです。

おわりに

今回学んだこと:

  • 辞書データからDataFrameを作成する
  • 配列データからDataFrameを作成する
  • csvデータをDataFrameとして読み込む

チュートリアルは読んだけど取り上げなかったもの:

  • Seriesに関連したところ
  • Multi-index(階層化されたインデックス)の話

次回:

necostat.hatenablog.jp