Open In Colab

インデクサ#

pandasのSeriesおよびDataFrameにはインデクサと呼ばれるインデックス(ラベル)にアクセスするためのプロパティ(属性)があります。インデクサを利用することで、データを効率よく抽出したり、書き換えることができます。

.loc

インデックス(ラベル)による指定

.iloc

位置(順序)による指定

.at

インデックス(ラベル)による指定、値(単一のデータ)が対象

.iat

位置(順序)による指定、値(単一のデータ)が対象

.locインデクサ#

.locインデクサはデータのインデックス(ラベル)を添字に指定して、データにアクセスします。

import pandas as pd

ser = pd.Series(list("ABCDE"), index=list("abcde"))
ser
a    A
b    B
c    C
d    D
e    E
dtype: object
ser.loc["b"]
'B'

リストやタプルなどと同様にスライスによる指定ができます。.locインデクサによるスライスは 開始位置と終了位置が含まれます

ser.loc["b":"d"]
b    B
c    C
d    D
dtype: object
ser.loc["c":]
c    C
d    D
e    E
dtype: object
ser.loc[:"c"]
a    A
b    B
c    C
dtype: object

すべての要素にアクセスする場合は、添字に : を渡します。

ser.loc[:]
a    A
b    B
c    C
d    D
e    E
dtype: object

添字にリストを渡すことで、リスト内に指定した要素にアクセスできます。

ser.loc[["a", "c"]]
a    A
c    C
dtype: object

練習問題1#

ser オブジェクトからインデックス(ラベル)が "a" から "d" までを抽出してください。

# 解答セル

練習問題2#

ser オブジェクトからインデックス(ラベル)が "b""d" を抽出してください。

DataFrameの場合は添字に 行のインデックス, 列のインデックス の形式で指定します。

df = pd.DataFrame(
    [
        ["r1c1", "r1c2", "r1c3"],
        ["r2c1", "r2c2", "r2c3"],
        ["r3c1", "r3c2", "r3c3"],
    ],
    index=["r1", "r2", "r3"],
    columns=["c1", "c2", "c3"]
)
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 r2c2 r2c3
r3 r3c1 r3c2 r3c3
df.loc["r1", "c2"]
'r1c2'

Seriesと同様にスライスやリストを利用したアクセスができます。

df.loc["r2":, ["c1", "c3"]]
c1 c3
r2 r2c1 r2c3
r3 r3c1 r3c3

練習問題3#

df オブジェクトから "r2c1" を参照してください。

# 解答セル

練習問題4#

df オブジェクトから「r2」以降の行と、「c1, c3」列を参照してください。

c1 c3
r2 r2c1 r2c3
r3 r3c1 r3c3
# 解答セル

.ilocインデクサ#

.ilocインデクサはデータの位置(順序)を添字に指定して、データにアクセスします。

ser
a    A
b    B
c    C
d    D
e    E
dtype: object
ser.iloc[1]
'B'

DataFrameの場合は添字に 行のインデックス, 列のインデックス の形式で指定します。

df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 r2c2 r2c3
r3 r3c1 r3c2 r3c3
df.iloc[0, 2]
'r1c3'

リストやタプルなどと同様にスライスによる指定ができます。.locインデクサとは異なり、リストやタプルと同じ挙動をします。

ser.iloc[2:4]
c    C
d    D
dtype: object
"ABCDE"[2:4]
'CD'

.locインデクサと同様に添字にリストを渡すことで、リスト内に指定した要素にアクセスできます。

ser.iloc[[1, 3]]
b    B
d    D
dtype: object
df.iloc[[0, 2], [1, 2]]
c2 c3
r1 r1c2 r1c3
r3 r3c2 r3c3

練習問題5#

df オブジェクトから .iloc インデクサを使って「r2」以降の行と、「c1, c3」列を参照してください。

c1 c3
r2 r2c1 r2c3
r3 r3c1 r3c3
# 解答セル

.atインデクサ、iatインデクサ#

SeriesおよびDataFrameのインデクサの添字に単なる値を指定する場合は、.locインデクサの変わりに.atインデクサ、.ilocインデクサの変わりに.iatインデクサを利用すると高速に処理できます。

ser.at["b"]
'B'
ser.iat[0]
'A'
df.loc["r1", "c2"]
'r1c2'
df.iloc[0, 2]
'r1c3'

.atインデクサおよび.iatインデクサに複数の要素(スライス、リスト)を渡すと InvalidIndexErrorValueError 例外を送出されます。

>>> ser.at["a":]
InvalidIndexError: slice(1, None, None)
>>> df.iat[[0, 1], 1]
ValueError: iAt based indexing can only have integer indexers

要素の変更#

インデックスに指定した要素に値を代入することで、要素が変更できます。

ser
a    A
b    B
c    C
d    D
e    E
dtype: object
ser.loc["b"] = "BB"
ser
a     A
b    BB
c     C
d     D
e     E
dtype: object
df.loc["r2", "c2"] = "R2C2"
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 R2C2 r2c3
r3 r3c1 r3c2 r3c3

インデックスを範囲指定した場合に値を代入した場合は、同じ値で埋められます。

ser.loc["b":"d"] = "BCD"
ser
a      A
b    BCD
c    BCD
d    BCD
e      E
dtype: object
df.loc["r2":, "c2"] = "R2C2-R3C2"
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 R2C2-R3C2 r2c3
r3 r3c1 R2C2-R3C2 r3c3

複数の要素を代入する場合は、インデックスに指定した要素数を合致させます。

ser.loc["b":"d"] = ["b", "c", "d"]
ser
a    A
b    b
c    c
d    d
e    E
dtype: object
df.loc["r2":, "c2"] = ["R2C2", "R3C2"]
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 R2C2 r2c3
r3 r3c1 R3C2 r3c3

インデックスを指定して、複数要素を代入した際に、インデックスと代入した要素数が合致しなかった場合は ValueError 例外が送出されます。

>>> ser.loc["d":] = ["D", "E", "F"]
ValueError: cannot set using a slice indexer with a different length than the value

練習問題6#

ser オブジェクトの値2を20に、4を40に変更してください。

ser = pd.Series(range(5), index=list("abcde"))
ser
a    0
b    1
c    2
d    3
e    4
dtype: int64
# 解答セル

練習問題7#

df オブジェクトの「c3」列の値を”C3”に変更してください。

c1 c2 c3
r1 r1c1 r1c2 C3
r2 r2c1 r2c2 C3
r3 r3c3 r3c2 C3
df = pd.DataFrame(
    [
        ["r1c1", "r1c2", "r1c3"],
        ["r2c1", "r2c2", "r2c3"],
        ["r3c3", "r3c2", "r3c3"],
    ],
    index=["r1", "r2", "r3"],
    columns=["c1", "c2", "c3"]
)
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 r2c2 r2c3
r3 r3c3 r3c2 r3c3
# 解答セル

要素の追加#

インデックスに存在しない要素に値を代入することで、要素が追加できます。

ser
a    0
b    1
c    2
d    3
e    4
dtype: int64
ser.loc["f"] = "f"
ser
a    0
b    1
c    2
d    3
e    4
f    f
dtype: object
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 r2c2 r2c3
r3 r3c3 r3c2 r3c3
df.loc["r4", :] = ["r4c1", "r4c2", "r4c3"]
df
c1 c2 c3
r1 r1c1 r1c2 r1c3
r2 r2c1 r2c2 r2c3
r3 r3c3 r3c2 r3c3
r4 r4c1 r4c2 r4c3
df.loc[:, "c4"] = ["r1c4", "r2c4", "r3c4", "r4c4"]
df
c1 c2 c3 c4
r1 r1c1 r1c2 r1c3 r1c4
r2 r2c1 r2c2 r2c3 r2c4
r3 r3c3 r3c2 r3c3 r3c4
r4 r4c1 r4c2 r4c3 r4c4