【Pandas Series】値の抽出・変更 [loc, at, iloc, iat]

 ※ 本記事は広告・プロモーションを含みます。
Pandas

たっきん(Twitter)です!

今回はSeriesの基本操作である任意の位置の値(要素)の抽出・変更の操作方法について説明していきます。

使用するのは.loc[].at[].iloc[].iat[]の4つになります。

DataFrameでも同様に上記4つの機能が実装されており、使用感もほぼ同じになりますが、この記事ではSeriesでの操作に特化して説明していきます。

違いやそれぞれの用途は次の表の通りになります。

位置指定方法
:ラベル名
位置指定方法
:番号
用途
.loc[].iloc[]単一、複数のデータを抽出・変更
.at[].iat[]単一のデータを抽出・変更
(処理速度は.loc[].iloc[]より高速)

DataFrameの記事でも書きましたが、僕個人的に使用頻度が高いのは抽出・変更位置をラベル名で指定する.loc[].at[]になります。

要素位置の番号で指定する.iloc[],.iat[]を否定するわけではありませんが、番号指定ならリストlistを使用しているのと大差ありません。
.iloc[],.iat[]を多用している場合、本当にSeriesを使用するべきか、それともリストlist使用するべきか、よく考えた方が良いです。

なので基本的に.loc[].at[]を使用した例を中心に説明していき、.iloc[].iat[]は補足の位置づけで説明していきます。

また、説明するにあたり、次のSeriesから値を抽出・変更する例をサンプルコードを使って説明してきます。

import pandas as pd

o_data = [
    108.432,
    109.252,
    108.799,
    108.854,
    108.545,
]

o_index = [
    "2020/4/6",
    "2020/4/7",
    "2020/4/8",
    "2020/4/9",
    "2020/4/10",
]

# Seriesの生成
sr = pd.Series(data=o_data, index=o_index, name="open")
print(sr)
"""
2020/4/6     108.432
2020/4/7     109.252
2020/4/8     108.799
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""
Pandasに関する記事を多数書いてます

値を抽出・変更 [loc, iloc]

単ー or 複数の値を抽出したり、値を変更したりする場合はloc[], iloc[]を使用します。

範囲の選択は次のように指定します。

  • .loc["ラベル"]
  • .iloc[番号]

範囲の指定方法は次の3つが主となります。

指定方法.loc[]記述例.iloc[]記述例
1単一.loc[“label1”].iloc[0]
2リスト.loc[
 [“label1”, “label3”, “label5”]
]
.iloc[
 [0, 1, 2]
]
3スライス.loc[“label1″:”label5”].iloc[0:2]

.loc[]のスライス指定は、通常のpythonスライスとは異なり「終了」が選択対象に含まれるので注意しましょう!
 ・.loc["label1":"label5"] → ”label5″も含まれる
 ・.iloc[0:2] → [2]の位置(3番目)は含まれない

単ーの値

下記の単一の値を選択する場合の例になります。

単一の値を抽出したい場合は単一のラベルを指定します。

# 単一の値を抽出
elem = sr.loc["2020/4/8"]
print(elem)
"""
108.799
"""

値を変更する場合は次のように記述します。

# 単一の値を変更
sr.loc["2020/4/8"] = 0.0
print(sr)
"""
2020/4/6     108.432
2020/4/7     109.252
2020/4/8       0.000
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""

以下は、.iloc[]を使用した記述例になります。

# 単一の値を抽出
elem = sr.iloc[2]
print(elem)
"""
108.799
"""

# 単一の値を変更
sr.iloc[2] = 0.0
print(sr)
"""
2020/4/6     108.432
2020/4/7     109.252
2020/4/8       0.000
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""

単ーの値を取得したい場合は.loc[].iloc[]を使用するのではなく、.at[].iat[]を使用した方が良いです。
.at[].iat[]は単一の値しか抽出・変更ができませんが、.loc[].iloc[]よりも高速に処理できるメリットがあります。

複数の値(リスト指定)

下記の複数の値をリストで選択する場合の例になります。

複数の値をリスト指定で抽出した場合はSeries型で取得されます。

# 複数の値(リスト指定)を抽出
sr_elems = sr.loc[["2020/4/6", "2020/4/8", "2020/4/10"]]
print(sr_elems)
"""
2020/4/6     108.432
2020/4/8     108.799
2020/4/10    108.545
Name: open, dtype: float64
"""

print(type(sr_elems))
"""
<class 'pandas.core.series.Series'>
"""

次は値を変更する場合です。

単一の値で代入すると、リスト指定した全ての値が代入値に変更されます。

# 複数の値(リスト指定)を変更(単一の値で代入)
sr.loc[["2020/4/6", "2020/4/8", "2020/4/10"]] = -1.0
print(sr)
"""
2020/4/6      -1.000
2020/4/7     109.252
2020/4/8      -1.000
2020/4/9     108.854
2020/4/10     -1.000
Name: open, dtype: float64
"""

値を個別に設定したい場合はリストで代入します。

リストの要素順に値が設定されます。

ただし、代入するリストの要素数と変更する値の要素数が一致していないとValueErrorが発生しますので、リストで追加する際は要素数に注意しましょう!

# 複数の値(リスト指定)を変更(リストで代入)
sr.loc[["2020/4/6", "2020/4/8", "2020/4/10"]] = [1.0, 2.0, 3.0]
print(sr)
"""
2020/4/6       1.000
2020/4/7     109.252
2020/4/8       2.000
2020/4/9     108.854
2020/4/10      3.000
Name: open, dtype: float64
"""

# 変更する要素数が一致していないと"ValueError"が発生
sr.loc[["2020/4/6", "2020/4/8", "2020/4/10"]] = [4.0, 5.0]
"""
ValueError: cannot set using a list-like indexer with a different length than the value
"""

以下は、.iloc[]を使用した記述例になります。

# 複数の値(リスト指定)を抽出
sr_elems = sr.iloc[[0, 2, 4]]
print(sr_elems)
"""
2020/4/6     108.432
2020/4/8     108.799
2020/4/10    108.545
Name: open, dtype: float64
"""

# 複数の値(リスト指定)を変更(単一の値で代入)
sr.iloc[[0, 2, 4]] = -1.0
print(sr)
"""
2020/4/6      -1.000
2020/4/7     109.252
2020/4/8      -1.000
2020/4/9     108.854
2020/4/10     -1.000
Name: open, dtype: float64
"""

# 複数の値(リスト指定)を変更(リストで代入)
sr.iloc[[0, 2, 4]] = [1.0, 2.0, 3.0]
print(sr)
"""
2020/4/6       1.000
2020/4/7     109.252
2020/4/8       2.000
2020/4/9     108.854
2020/4/10      3.000
Name: open, dtype: float64
"""

複数の値(スライス指定)

スライスを使って値を変更する機会は少ないと思いますが、一応説明していきます。

下記の複数の値をスライスで選択する場合の例になります。

複数の値をスライス指定で抽出した場合はSeries型で取得されます。

# 複数の値(スライス指定)を抽出
sr_elems = sr.loc["2020/4/7":"2020/4/9"]
print(sr_elems)
"""
2020/4/7    109.252
2020/4/8    108.799
2020/4/9    108.854
Name: open, dtype: float64
"""

print(type(sr_elems))
"""
<class 'pandas.core.series.Series'>
"""

値を変更する場合は次のように記述します。

# 複数の値(スライス指定)を変更
sr.loc["2020/4/7":"2020/4/9"] = -2.0
print(sr)
"""
2020/4/6     108.432
2020/4/7      -2.000
2020/4/8      -2.000
2020/4/9      -2.000
2020/4/10    108.545
Name: open, dtype: float64
"""

以下は、.iloc[]を使用した記述例になります。

# 複数の値(スライス指定)を抽出
sr_elems = sr.iloc[1:3]
print(sr_elems)
"""
2020/4/7    109.252
2020/4/8    108.799
Name: open, dtype: float64
"""

# 複数の値(スライス指定)を変更
sr.iloc[1:3] = -2.0
print(sr)
"""
2020/4/6     108.432
2020/4/7      -2.000
2020/4/8      -2.000
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""

単ーの値を抽出・変更 [at, iat]

単ーの値を抽出したり、変更したりする場合はat[]iat[]を使用します。

loc[]iloc[]の単一指定でも同じことができますが、at[]iat[]の方が高速に処理できますので、単一の値の抽出・変更はこちらを使用するようにしましょう!

位置の選択は次のように指定します。

  • .at["ラベル"]
  • .iat[番号]

サンプルコードで動作を確認してみましょう!

下記の値を選択する場合の例で説明していきます。

# 単一の値を抽出
elem = sr.at["2020/4/8"]
print(elem)
"""
108.799
"""

# 単一の値を変更
sr.at["2020/4/8"] = 0.0
print(sr)
"""
2020/4/6     108.432
2020/4/7     109.252
2020/4/8       0.000
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""

以下は、.iat[]を使用した記述例になります。

# 単一の値を抽出
elem = sr.iat[2]
print(elem)
"""
108.799
"""

# 単一の値を変更
sr.iat[2] = 0.0
print(sr)
"""
2020/4/6     108.432
2020/4/7     109.252
2020/4/8       0.000
2020/4/9     108.854
2020/4/10    108.545
Name: open, dtype: float64
"""

参考

スポンサーリンク

コメント

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