Pandas DataFrame: loc, iloc, at, iatで自由自在にデータ操作! 🎯
PandasのDataFrameを扱う上で、特定のセルや行、列の値を取得したり変更したりする操作は日常茶飯事です。しかし、どのような状況でどのメソッドを使うべきか迷うことはありませんか? Pandasには、この目的のために**loc**, iloc, at, **iat**という4つの強力なアクセサーが用意されています。
この記事では、これらのメソッドのそれぞれの特徴と使い分け、そして効率的なデータ操作のコツを、わかりやすいコード例とともに徹底解説します。
loc vs iloc: ラベル vs 位置(整数)で選ぶ 🏷️🔢
まず、最もよく使われるlocとilocの違いを理解しましょう。
loc: ラベル(列名・インデックス名)でアクセス 🏷️
locは、**行と列の「ラベル名」**を使ってデータにアクセスします。特定の名前が付いた行や列を操作したい場合に非常に便利です。
-
単一の要素を取得:
df.loc[行ラベル, 列ラベル] -
単一の要素を変更:
df.loc[行ラベル, 列ラベル] = 新しい値 -
範囲を指定:
df.loc[開始行ラベル:終了行ラベル, 開始列ラベル:終了列ラベル](終了ラベルを含む) -
リストで複数指定:
df.loc[[行ラベル1, 行ラベル2], [列ラベル1, 列ラベル2]] -
条件式で選択:
df.loc[条件式, 列ラベル]
import pandas as pd
df = pd.DataFrame({
'商品': ['Apple', 'Banana', 'Cherry'],
'価格': [100, 150, 200],
'在庫': [10, 5, 8]
}, index=['A', 'B', 'C']) # 行インデックスをラベルにする
print("--- 元のDataFrame ---")
print(df)
# ラベル名で単一の値を取得
price_A = df.loc['A', '価格']
print(f"\n価格A: {price_A}") # 100
# ラベル名で値を変更
df.loc['B', '在庫'] = 12
print(f"\n在庫Bを変更後:\n{df}")
# ラベルの範囲で複数行・列を選択 (終了ラベルも含む)
sub_df = df.loc['A':'B', '商品':'価格']
print(f"\n'A'から'B'行、'商品'から'価格'列を選択:\n{sub_df}")
# 条件式とラベルで選択
high_stock_items = df.loc[df['在庫'] > 10, '商品']
print(f"\n在庫が10より大きい商品の名前:\n{high_stock_items}")
iloc: 位置(整数インデックス)でアクセス 🔢
ilocは、**行と列の「位置」(整数インデックス)**を使ってデータにアクセスします。Pythonのリストと同じように、0から始まる数値で指定します。
-
単一の要素を取得:
df.iloc[行位置, 列位置] -
単一の要素を変更:
df.iloc[行位置, 列位置] = 新しい値 -
範囲を指定:
df.iloc[開始行位置:終了行位置, 開始列位置:終了列位置](終了位置は含まない) -
リストで複数指定:
df.iloc[[行位置1, 行位置2], [列位置1, 列位置2]]
import pandas as pd
df = pd.DataFrame({
'商品': ['Apple', 'Banana', 'Cherry'],
'価格': [100, 150, 200],
'在庫': [10, 5, 8]
}) # デフォルトの数値インデックス
print("--- 元のDataFrame (デフォルトインデックス) ---")
print(df)
# 位置で単一の値を取得 (0行目、1列目)
price_0_1 = df.iloc[0, 1]
print(f"\n0行目1列目の値: {price_0_1}") # 100
# 位置で値を変更 (1行目、2列目)
df.iloc[1, 2] = 15
print(f"\n1行目2列目を変更後:\n{df}")
# 位置の範囲で複数行・列を選択 (終了位置は含まない)
sub_df_iloc = df.iloc[0:2, 0:2] # 0,1行目と0,1列目
print(f"\n0から1行目、0から1列目を選択:\n{sub_df_iloc}")
at vs iat: 単一要素への高速アクセス ⚡
atとiatは、locやilocと似ていますが、単一の要素へのアクセスに特化しており、より高速です。ループ処理などで大量の単一要素を操作する場合にパフォーマンスのメリットがあります。
at: ラベルで高速アクセス ⚡
atはラベル名を使って単一の要素にアクセスします。
-
使い方:
df.at[行ラベル, 列ラベル]
import pandas as pd
df = pd.DataFrame({
'商品': ['Apple', 'Banana'],
'価格': [100, 150]
}, index=['A', 'B'])
# 'B'行の'価格'をatで取得
price_B_at = df.at['B', '価格']
print(f"atで取得した価格B: {price_B_at}") # 150
# 'A'行の'在庫'をatで変更
df.at['A', '価格'] = 110
print(f"atで価格Aを変更後:\n{df}")
iat: 位置で高速アクセス ⚡
iatは**位置(整数インデックス)**を使って単一の要素にアクセスします。
-
使い方:
df.iat[行位置, 列位置]
import pandas as pd
df = pd.DataFrame({
'商品': ['Apple', 'Banana'],
'価格': [100, 150]
}) # デフォルトの数値インデックス
# 1行目、1列目の値をiatで取得
price_1_1_iat = df.iat[1, 1]
print(f"iatで取得した1行目1列目の値: {price_1_1_iat}") # 150
# 0行目、1列目の値をiatで変更
df.iat[0, 1] = 105
print(f"iatで0行目1列目を変更後:\n{df}")
まとめ:使い分けのヒント 💡
| メソッド | アクセス方法 | 複数選択 | 高速性 | 主な用途 |
loc |
ラベル名 | ✅ 可能 | 通常 | 特定のラベルを持つデータ群の取得・変更 |
iloc |
整数位置 | ✅ 可能 | 通常 | 特定のインデックスを持つデータ群の取得・変更 |
at |
ラベル名 | ❌ 不可 | 高速 | 特定の1セルへの高速な取得・変更(ラベル) |
iat |
整数位置 | ❌ 不可 | 高速 | 特定の1セルへの高速な取得・変更(位置) |
-
日常的な操作: ほとんどの場合、
locとilocで事足ります。行インデックスや列名が意味を持つ場合はlocを、純粋に位置で指定したい場合はilocを選びましょう。 -
パフォーマンスが重要な場合: 大量のループ処理などで単一のセルを繰り返し操作する必要がある場合は、
atやiatを積極的に使いましょう。
これらのメソッドを適切に使いこなすことで、Pandasでのデータ操作がより直感的かつ効率的になり、分析作業の生産性が向上するでしょう。

