インデクサ
Contents
インデクサ#
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インデクサに複数の要素(スライス、リスト)を渡すと InvalidIndexError
や ValueError
例外を送出されます。
>>> 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 |