PythonのPandasライブラリにおける .loc
は、ラベル(インデックスや列名)に基づいてデータを抽出・操作するための非常に強力なアクセサです。
データ分析では頻繁に使用され、「行や列を条件指定で取り出す」「値を更新する」「フィルタリングする」など、さまざまな用途に活用できます。
目次
.loc
の基本構文
df.loc[行ラベル, 列ラベル]
行ラベル
:取得したい行のインデックスラベルや条件式列ラベル
:取得したい列の名前(ラベル)- 両方を省略せずに記述することができ、ラベルベースのアクセスが可能です
基本的な使い方の例
まず簡単なデータフレームを用意します。
import pandas as pd
# ▼ データ準備
data = {
'名前': ['田中', '佐藤', '鈴木'],
'年齢': [25, 30, 22],
'職業': ['エンジニア', 'デザイナー', 'マーケター']
}
df = pd.DataFrame(data, index=['A', 'B', 'C'])
print(" 初期データフレーム:\n", df)
単一行の取得
print("\n① 単一行の取得 df.loc['A']:\n", df.loc['A'])
複数行の取得
print("\n② 複数行の取得 df.loc[['A', 'C']]:\n", df.loc[['A', 'C']])
行と列を指定してデータを取得
print("\n③-1 行と列を指定して1セル取得 df.loc['A', '職業']:\n", df.loc['A', '職業'])
print("\n③-2 複数列を指定 df.loc['B', ['名前', '職業']]:\n", df.loc['B', ['名前', '職業']])
条件式を使ったフィルタリング
年齢が25歳以上の人を抽出。
print("\n④ 年齢が25歳以上の行を抽出 df.loc[df['年齢'] >= 25]:\n", df.loc[df['年齢'] >= 25])
条件を使って特定列だけ取得
print("\n⑤ 年齢が25歳以上の人の名前のみを抽出:\n", df.loc[df['年齢'] >= 25, '名前'])
データの更新
df.loc['A', '年齢'] = 26
print("\n⑥-1 Aさんの年齢を26に更新:\n", df)
df.loc[['A', 'C'], '職業'] = 'アナリスト'
print("\n⑥-2 AとCの職業を'アナリスト'に更新:\n", df)
全行の一部列だけを取得
print("\n⑦ 名前と職業のみ抽出:\n", df.loc[:, ['名前', '職業']])
新しい行を追加(存在しないインデックスに代入)
df.loc['D'] = ['高橋', 28, 'データサイエンティスト']
print("\n⑧ 新しい行Dを追加:\n", df)
.loc
と.iloc
の違い
項目 | .loc | .iloc |
---|---|---|
参照方法 | ラベル(名前)ベース | 整数の位置ベース |
行指定 | df.loc['A'] | df.iloc[0] |
フィルタ式 | 使用可能 | 使用不可(ブールインデックスならOK) |
主な用途 | 名前でのアクセスや条件抽出 | 配列的な位置指定アクセス |
応用例:複雑な条件フィルタ
例えば「職業がエンジニアまたは年齢が30歳以上の人」の名前を抽出したい場合:
print("\n⑨ 職業がエンジニア または 年齢が30歳以上の名前:\n",
df.loc[(df['職業'] == 'エンジニア') | (df['年齢'] >= 30), '名前'])
注意点
.loc
でスライス(df.loc['A':'C']
)する場合、終了インデックスも含まれます(.iloc
とは異なる点)。- 存在しないラベルを指定するとエラーになります(追加時を除く)。
- 条件式の括弧
()
を忘れるとエラーになることが多いです(優先順位の問題)。
よくある用途まとめ
目的 | サンプルコード |
---|---|
単一セル取得 | df.loc['A', '名前'] |
特定行取得 | df.loc['B'] |
複数列取得 | df.loc[:, ['名前', '年齢']] |
条件で抽出 | df.loc[df['年齢'] > 25] |
値の更新 | df.loc['A', '職業'] = '管理職' |
条件で更新 | df.loc[df['職業'] == 'デザイナー', '年齢'] = 35 |
以上、PythonのPandasのlocの使い方についてでした。
最後までお読みいただき、ありがとうございました。