DataFrameの一部を抽出するiloc属性の解説

ilocアイキャッチ pandas

【宣伝】pandasのオススメの本の紹介

このブログでも詳しくpandasの使い方を紹介していますが、体系的に学びたい方や、本の方が良いという方には以下の本をオススメしておきます。

pandasライブラリ活用入門[第2版]

準備

loc属性iloc属性を使ってDataFrameの一部を抽出する方法を説明する。
この記事ではiloc属性について説明する。

説明のために以下のDataFrameを用意する。「コードでDataFrameを用意する方法」についても別の記事で説明している。

import pandas as pd # ※以降のコードでは省略する

df = pd.DataFrame({
    "student_id": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    "name": ["taro", "hanako", "jiro", "fuyumi", "sigeru", "satoshi", "misuzu", "taro", "saburo", "ichiro"],
    "math": [50, 68, 90, 35, 49, 77, 88, 91, 80, 100],
    "english": [10, 99, 55, 54, 30, 29, 67, 45, 46, 88]
})
df
サンプルDataFrame

行番号, 列番号を指定して抽出するiloc属性

iloc属性はindex, columnsを無視して、行番号・列番号を指定して抽出することができる。

index, columnsについては以下の記事で解説した。

「index, columnsを無視する」の意味

以下のランダムに並び替えたDataFrameを説明に使う。
DataFrameをランダムに並び替える方法については、この記事で紹介した。

df_random = df.sample(frac=1, random_state=111)
df_random

iloc属性を使うと、上の画像のindexを無視して行番号や列番号で抽出する行や列を指定できる。

df_random.iloc[3]

上の例のように、ilocに3を指定するとindexが3の行(4, fuyumi, 35, 54)ではなく、行番号が3の行(3, jiro, 90, 55)の行が抽出される。

これがindex, columnsが無視される、ということの意味だ。

リストを使って複数行抽出する

loc属性と同様、行番号のリストを指定することで該当行を抽出することができる。
indexは無視され、行番号での指定になっていることに注意。

df_random.iloc[ [0, 2, 4] ] # 行番号が0,2,4の行を抽出する

numpyの配列を使って複数行抽出する

loc属性と同様、numpyの配列を指定することで該当行を抽出することができる。
この場合もindexは無視され、行番号での指定になっている。

import numpy as np

arr = np.array([3, 2, 6])
df_random.iloc[arr]

スライスを使って複数行抽出する

別の記事で解説するloc属性と異なるのが、このスライスの挙動である。
loc属性は終端を含んで抽出されるが、iloc属性は終端の行番号7の手前の行番号6の行までが抽出される。
注意してないとバグるポイントなので要注意。

df_random.iloc[2:7]

1列抽出する

loc属性と同様、iloc属性もカンマ( , )の前に抽出する行の指定、後ろに抽出する列の指定ができる。

この例のコロン( : )は全行抽出することを意味する。カンマの後ろには抽出する列番号を指定する。
※ 列名ではなく列番号

df_random.iloc[:, 1]

列番号1のname列が抽出される。

リストを使って複数列抽出する

前節の”1″の部分を列番号のリストにすることで複数列抽出できる。

df_random.iloc[:, [1, 3]]

列番号1のname列と、列番号3のenglish列が抽出された。

Python入門【pandas編】

このブログでは「Python入門【pandas編】」の記事群を整備中です。興味のある方は下のリンク先をチェックしてみてください。

コメント

タイトルとURLをコピーしました