【Python】Pandasで特定の値を高速に取得・更新する(at / iat)

PandasのDataFrameにおいて、特定の「行」と「列」を指定してピンポイントで1つの値(スカラ値)を取得・更新したい場合、lociloc よりも高速に動作するアクセサとして atiat が用意されています。

  • 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との違い

通常、データのアクセスには lociloc が使われますが、これらは「範囲選択」や「複数行・複数列」の取得にも対応できる多機能なアクセサです。

対して、atiat「単一の値(スカラ値)」へのアクセスに特化 しています。そのため、ループ処理の中で個別の値を頻繁に読み書きする場合などは、at / iat を使用することで処理速度の向上が期待できます。

  • df.at[row, col]: ラベル(名前)で場所を特定したい場合に使用。
  • df.iat[row_int, col_int]: 数値(位置)で場所を特定したい場合に使用。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次