PandasのDataFrameにおいて、特定の「行」と「列」を指定してピンポイントで1つの値(スカラ値)を取得・更新したい場合、loc や iloc よりも高速に動作するアクセサとして at と iat が用意されています。
- at: 行ラベル(インデックス名)と列名で指定
- iat: 行番号と列番号(整数)で指定
本記事では、これらを用いた値の参照と更新方法について解説します。
目次
実装サンプルコード
以下に、カフェのメニューデータ(価格・カロリー)を用いて、特定商品の情報を取得および修正するコードを示します。
import pandas as pd
def access_scalar_values():
"""
atとiatを使用して、DataFrame内の単一の値を操作する関数
"""
# 1. データの準備
# インデックスをドリンク名、カラムを価格・カロリーとするDataFrame
menu_items = ["Espresso", "Latte", "Mocha", "Cappuccino", "Americano"]
menu_data = {
"Price": [350, 450, 500, 450, 380],
"Calories": [10, 150, 280, 120, 15]
}
df = pd.DataFrame(menu_data, index=menu_items)
print("--- 初期メニューデータ ---")
print(df)
print("\n")
# 2. atによる値の取得(ラベル指定)
print("=== atによる取得(ラベル指定) ===")
# モカ(Mocha)の価格(Price)を取得
# 書式: df.at[行ラベル, 列名]
mocha_price = df.at["Mocha", "Price"]
print(f"Mochaの価格: {mocha_price} 円")
# 3. iatによる値の取得(位置指定)
print("\n=== iatによる取得(位置指定) ===")
# カプチーノ(Cappuccino)のカロリー(Calories)を取得
# Cappuccinoは上から4番目 -> 行番号 3
# Caloriesは左から2番目 -> 列番号 1
# 書式: df.iat[行番号, 列番号]
cappuccino_cal = df.iat[3, 1]
print(f"Cappuccinoのカロリー: {cappuccino_cal} kcal")
# 4. データの更新
print("\n=== 値の更新 ===")
# アメリカーノ(Americano)の価格を更新
print(f"更新前 Americano Price: {df.at['Americano', 'Price']}")
# atを使って値を代入(価格改定)
df.at["Americano", "Price"] = 400
print(f"更新後 Americano Price: {df.at['Americano', 'Price']}")
print("\n--- 更新後のDataFrame ---")
print(df)
if __name__ == "__main__":
access_scalar_values()
実行結果
--- 初期メニューデータ ---
Price Calories
Espresso 350 10
Latte 450 150
Mocha 500 280
Cappuccino 450 120
Americano 380 15
=== atによる取得(ラベル指定) ===
Mochaの価格: 500 円
=== iatによる取得(位置指定) ===
Cappuccinoのカロリー: 120 kcal
=== 値の更新 ===
更新前 Americano Price: 380
更新後 Americano Price: 400
--- 更新後のDataFrame ---
Price Calories
Espresso 350 10
Latte 450 150
Mocha 500 280
Cappuccino 450 120
Americano 400 15
解説:loc/ilocとの違い
通常、データのアクセスには loc や iloc が使われますが、これらは「範囲選択」や「複数行・複数列」の取得にも対応できる多機能なアクセサです。
対して、at と iat は 「単一の値(スカラ値)」へのアクセスに特化 しています。そのため、ループ処理の中で個別の値を頻繁に読み書きする場合などは、at / iat を使用することで処理速度の向上が期待できます。
df.at[row, col]: ラベル(名前)で場所を特定したい場合に使用。df.iat[row_int, col_int]: 数値(位置)で場所を特定したい場合に使用。
