ねこすたっと

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

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

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

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

前回:

necostat.hatenablog.jp

今回からデータテーブルの一部の行(= 観察単位, observation)や列(= 変数, variable)、あるいは両者が交差する要素にアクセスする方法を確認していきます。

最初にPandasライブラリを読み込んで、サンプルデータを作成しておきます。

import pandas as pd
df = pd.DataFrame(
    {"c1":[10,20,30],
     "c2":[40,50,60],
     "c3":[70,80,90]},
    index = ["r1","r2","r3"]
)
# 出力:
    c1  c2  c3
r1  10  40  70
r2  20  50  80
r3  30  60  90

インデックス名と位置を区別しやすいように、前者は数字ではなく文字列にしました。

ラベル名を使ったアクセス

行の名前(インデックス名)や列の名前(変数名)で部分抽出する方法です。.loc[]を使います。

要素を抽出

.loc[]のカッコの中に、抽出したい行と列の名前を指定します。行名と列名の間は,で区切ります。

df.loc["r1","c1"]  # 出力: 10

複数の行・列を指定したいときは、[ ]を使って名前のリストとして渡します。

df.loc[["r1","r2"], ["c1","c3"]]

# 出力:
    c1  c3
r1  10  70
r2  20  80

複数の行・列は:を使って範囲として指定することができます(スライシングといいます)。ラベル名を使った指定では、開始点も終了点も含まれることに注意です。

df.loc["r1":"r2", "c2":"c3"]

# 出力:
    c2  c3
r1  40  70
r2  50  80

開始点、あるいは終了点だけを指定することもできます。両方指定しなければ「全て」ということになります。

行を抽出

列名を空欄にすれば、指定した行の全ての変数を取り出すことができます。

df.loc["r1",]

# 出力:
c1    10
c2    40
c3    70
Name: r1, dtype: int64

列名を空欄にする代わりに、スライシング(:)で開始・終了を書かないでおいても同じです。

df.loc["r1", :]  # 出力: 省略

列を抽出

行の抽出のときと違って、行名は空欄だとエラーになります。全てを抽出したい場合は:を書かなければいけません(何故なのか、その背景は分かりません)。

df.loc[:,"c2"]

# 出力:
r1    40
r2    50
r3    60

位置番号を使ったアクセス

行や列の位置を番号で指定する方法です。.iloc[]を使います。

要素を抽出

.loc[]のカッコの中に、行の番号・列の番号を指定します。Pythonでは0から数え始めることに注意!

df.iloc[0,0]  # 出力: 10

.iloc[]でスライシングを使うときは終了点を含みません。例えば、

df.iloc[0:2,0]

だと、行番号0, 1のみが抽出され、行番号2(=3行目)は含まれません。

# 出力:
r1    10
r2    20
Name: c1, dtype: int64

行・列を抽出

基本的に.loc[]と同じです。列番号は空欄に出来ますが、行番号は空欄は不可で、:を入れておく必要があります。

おわりに

今回学んだこと:

  • ラベル名と位置番号で部分抽出する方法
  • 上記の両者において、スライシングの終了点の扱いが異なる

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

  • 部分抽出ではなく要素にアクセスする.at[], .iat[]については、同じような使い方であり.loc[], .iloc[]でも代用できると思ったので取り上げませんでした。

次回:

necostat.hatenablog.jp