【Pandas】データ選択:loc・iloc・条件フィルタリング・queryメソッド完全ガイド
データ選択は、データ分析で最も頻繁に行われる操作です。「これらの条件を満たすデータを見せてください」という場面は日常茶飯事です。Pandasには、ラベルによる選択、位置による選択、条件による選択、式による選択、さらにはSQLのようなクエリ文字列まで、豊富な選択メソッドが用意されています。本セクションでは、すべての選択方法を順に解説し、最もよくある「チェーンインデックス」の落とし穴を回避する方法を学びます。
⚠️ 注意: 以下のコードは、ローカルのPython環境で実行してください。
1. 学習内容
- ❶ locによるラベル選択
- ❷ ilocによる位置選択
- ❸ 条件フィルタリング(ブールインデックス)
- ❹ queryメソッド
- ❺ isinフィルタリングとチェーンインデックスの落とし穴
2. チャーリーの商品フィルタリングの悩み
(1) 課題:複数条件の組み合わせが煩雑すぎる
チャーリーは1000個の商品から「価格が50より大きく、かつ評価が4.0より大きい電子製品」を絞り込む必要があります。最初はブールインデックスを使って長い条件式を書きました:
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard',
'Mouse', 'Headset', 'Speaker', 'Camera', 'Charger'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics',
'Accessories', 'Accessories', 'Accessories', 'Accessories',
'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99,
29.99, 149.99, 89.99, 599.99, 19.99],
'stock': [50, 120, 80, 35, 200, 300, 150, 180, 25, 500],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2, 4.0, 4.4, 4.1, 4.8, 3.9]
})
# ブールインデックス — 動作するが冗長
result = df[(df['price'] > 50) & (df['rating'] > 4.0) & (df['category'] == 'Electronics')]
print(result[['name', 'price', 'rating']])
# name price rating
# 0 Laptop 999.99 4.7
# 1 Phone 699.99 4.5
# 2 Tablet 349.99 4.3
# 3 Monitor 449.99 4.6
# 8 Camera 599.99 4.8
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) 解決策:queryメソッドはより読みやすい
▶ サンプル:queryメソッドの基本
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:queryによる読みやすいクエリ(難易度 ⭐⭐)
PYTHON
# 同じ結果、はるかに読みやすい
result = df.query('price > 50 and rating > 4.0 and category == "Electronics"')
print(result[['name', 'price', 'rating']])
# 変数の使用
min_price = 50
min_rating = 4.0
result2 = df.query('price > @min_price and rating > @min_rating')
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(3) メリット:4つの選択方法、それぞれに強みがある
| メソッド | 構文 | 最適な用途 |
|---|---|---|
| loc | df.loc[row, col] |
正確なラベル選択 |
| iloc | df.iloc[r, c] |
位置ベースの選択 |
| ブールインデックス | df[condition] |
シンプルな条件 |
| query | df.query('expr') |
複雑な複数条件のフィルタリング |
3. loc:ラベル選択
(1) locの構文
df.loc[row_label, col_label] — ラベルで選択します。スライスは終端を含みます。
▶ サンプル:locによるラベル選択
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:locラベル選択(難易度 ⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
}, index=['A001', 'A002', 'A003', 'A004', 'A005'])
# ラベルで1行選択
print(df.loc['A001'])
# name Laptop
# price 999.99
# stock 50
# 複数行の選択
print(df.loc[['A001', 'A003']])
# 行スライス + 列スライス(ラベル、終端を含む)
print(df.loc['A001':'A003', 'name':'price'])
# name price
# A001 Laptop 999.99
# A002 Phone 699.99
# A003 Tablet 349.99
# 特定の行 + 特定の列
print(df.loc[['A001', 'A004'], ['name', 'stock']])
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) locを使った条件選択
▶ サンプル:locと条件の組み合わせ
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:loc + 条件(難易度 ⭐⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
})
# 行のフィルタリング + 列の選択を1回の操作で
expensive = df.loc[df['price'] > 400, ['name', 'price']]
print(expensive)
# name price
# 0 Laptop 999.99
# 1 Phone 699.99
# 3 Monitor 449.99
# 代入付き(安全 — チェーンインデックスなし)
df.loc[df['stock'] < 50, 'stock'] = 50 # 在庫の少ない商品を補充
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
4. iloc:位置選択
(1) ilocの構文
df.iloc[row_pos, col_pos] — 整数の位置で選択します。スライスは終端を含みません(Pythonスタイル)。
▶ サンプル:ilocによる位置選択
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:iloc位置選択(難易度 ⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200]
})
# 位置で1行選択
print(df.iloc[0]) # 最初の行(Laptop)
# 位置リストで複数行選択
print(df.iloc[[0, 2, 4]])
# 行スライス + 列スライス(位置、終端を含まない)
print(df.iloc[0:3, 0:2])
# name price
# 0 Laptop 999.99
# 1 Phone 699.99
# 2 Tablet 349.99
# 最後の2行
print(df.iloc[-2:])
# 1行おきに選択
print(df.iloc[::2])
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) locとilocの主な違い
| 機能 | loc | iloc |
|---|---|---|
| インデックスの基準 | ラベル | 整数の位置 |
| スライスの終端 | 終端を含む | 終端を含まない |
| 文字列ラベル | ✅ | ❌ |
| 負のインデックス | ❌ | ✅ |
| 条件フィルタリング | ✅ | ❌ |
| 推奨シナリオ | 名前がわかっているとき | 位置がわかっているとき |
🔥 よくある間違い:
df.loc[0:3]は0、1、2、3行目(4行)を含みますが、df.iloc[0:3]は0、1、2行目(3行)を含みます。これがlocとilocで最も混乱しやすいポイントです。
5. 条件フィルタリング(ブールインデックス)
(1) 単一条件と複数条件
▶ サンプル:条件フィルタリング
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:条件フィルタリング(難易度 ⭐⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
# 単一条件
print(df[df['price'] > 400])
# 複数条件:&(AND)、|(OR)、~(NOT)
# 各条件を必ず括弧で囲んでください!
high_price_good_rating = df[(df['price'] > 400) & (df['rating'] >= 4.5)]
print(high_price_good_rating[['name', 'price', 'rating']])
# OR条件
hot_items = df[(df['price'] > 500) | (df['stock'] > 100)]
print(hot_items[['name', 'price', 'stock']])
# NOT条件
not_electronics = df[~(df['category'] == 'Electronics')]
print(not_electronics)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
⚠️ 注意: 複数条件を組み合わせる場合は、
and / or / not ではなく、必ず & / | / ~ を使用してください。各条件は括弧で囲む必要があり、囲まないと演算子の優先順位によりエラーが発生します。
(2) 文字列条件
▶ サンプル:文字列条件フィルタリング
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:文字列条件フィルタリング(難易度 ⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Wireless Mouse', 'USB Keyboard', 'Bluetooth Headset',
'Wireless Speaker', 'USB Camera'],
'price': [29.99, 79.99, 149.99, 89.99, 599.99]
})
# 部分文字列を含む
wireless = df[df['name'].str.contains('Wireless')]
print(wireless)
# 指定の文字列で始まる
usb = df[df['name'].str.startswith('USB')]
print(usb)
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
6. queryメソッド
(1) 基本構文
df.query('expression') — 文字列の式を使って行をフィルタリングし、SQLに近い可読性を提供します。
▶ サンプル:queryによる式クエリ
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:query式クエリ(難易度 ⭐⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99],
'stock': [50, 120, 80, 35, 200],
'rating': [4.7, 4.5, 4.3, 4.6, 4.2]
})
# シンプルな条件
print(df.query('price > 400'))
# 複数条件(&/|の代わりにand/orを使用)
print(df.query('price > 400 and rating >= 4.5'))
# 文字列の比較
print(df.query('category == "Electronics"'))
# @でPythonの変数を参照
threshold = 100
print(df.query('stock > @threshold'))
# スペースを含む列名(バッククォート)
# df.query('`unit price` > 100')
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) queryとブールインデックスの比較
| 機能 | ブールインデックス | query |
|---|---|---|
| 構文 | df[(df.a>1) & (df.b<2)] |
df.query('a>1 and b<2') |
| 可読性 | 括弧のネスト | SQLに近い |
| 変数の参照 | そのまま使用 | @プレフィックスが必要 |
| スペースを含む列名 | 問題なし | バッククォートが必要 |
| パフォーマンス | やや遅い(大規模DF) | やや速い(エンジン最適化) |
| 柔軟性 | 最も高い | 式の構文に制限あり |
7. isinフィルタリング
(1) 複数値のマッチング
▶ サンプル:isinによる複数値フィルタリング
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:isin複数値フィルタリング(難易度 ⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet', 'Monitor', 'Keyboard'],
'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Accessories'],
'price': [999.99, 699.99, 349.99, 449.99, 79.99]
})
# 複数のカテゴリ値でフィルタリング
target_cats = ['Electronics', 'Audio']
# 注意:Audioはデータに存在しない → マッチなし、エラーもなし
result = df[df['category'].isin(target_cats)]
print(result[['name', 'category']])
# 否定:リストに含まれないもの
other = df[~df['category'].isin(['Electronics'])]
print(other)
# Accessoriesのみ
# 数値でのisin
target_prices = [999.99, 79.99]
print(df[df['price'].isin(target_prices)])
# LaptopとKeyboard
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) isinと==の複数値比較
| メソッド | 構文 | 用途 |
|---|---|---|
| isin | df[col].isin([v1,v2,v3]) |
複数値のマッチング |
| == | df[col] == v1 |
単一値のマッチング |
| | の組み合わせ | (df[col]==v1) | (df[col]==v2) |
少数の複数値 |
| query | df.query('col in ["v1","v2"]') |
読みやすい複数値マッチング |
8. チェーンインデックスの落とし穴
(1) チェーンインデックスとは
▶ サンプル:チェーンインデックスの危険性
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:チェーンインデックスの隠れた危険(難易度 ⭐⭐)
PYTHON
import pandas as pd
df = pd.DataFrame({
'name': ['Laptop', 'Phone', 'Tablet'],
'price': [999.99, 699.99, 349.99],
'category': ['Electronics', 'Electronics', 'Electronics']
})
# ❌ チェーンインデックス — SettingWithCopyWarningが発生する可能性あり
# df[df['price'] > 400]['price'] = 0 # 予測不能!
# ✅ locを使った単一操作
df.loc[df['price'] > 400, 'price'] = 0 # 常に正しく動作
# ❌ 別のチェーン形式
# df[df['category'] == 'Electronics']['stock'] = 100
# ✅ 正しい書き方
df.loc[df['category'] == 'Electronics', 'stock'] = 100
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
🔥 よくある間違い: チェーンインデックス
df[condition][col] = value は、元のDataFrameを変更しない場合があります(中間結果がコピーになるため)。正しい書き方は df.loc[condition, col] = value です。行と列を一度に指定する単一操作です。
(2) 安全な選択の判断ツリー
graph TB
Q["データを選択する必要がある?"] -->|"読み取りのみ"| LOC["loc / iloc / ブール"]
Q -->|"読み取り + 代入"| SAFE["loc[row_cond, col] = value"]
Q -->|"複雑なフィルタ"| QUERY["query()"]
Q -->|"複数値マッチング"| ISIN["isin()"]
SAFE --> WARN["❌ 絶対にやらない:df[cond][col] = val"]
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
9. 総合例:ECサイトの商品多次元フィルタリング
▶ サンプル:商品フィルタリングの完全なワークフロー
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
:商品フィルタリングの完全なワークフロー(難易度 ⭐⭐⭐)
PYTHON
import pandas as pd
import numpy as np
# ============================================
# 総合例:ECサイト商品の
# 多次元選択ワークフロー
# ============================================
# 1. 商品カタログの作成
np.random.seed(42)
df = pd.DataFrame({
'name': [f'Product_{i:03d}' for i in range(1, 51)],
'category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports'], 50),
'price': np.round(np.random.uniform(10, 500, 50), 2),
'stock': np.random.randint(0, 300, 50),
'rating': np.round(np.random.uniform(3.0, 5.0, 50), 1),
'brand': np.random.choice(['Alpha', 'Beta', 'Gamma', 'Delta'], 50)
})
# 2. loc:正確な選択
print("=== 価格200超の電子製品 ===")
elec_expensive = df.loc[
(df['category'] == 'Electronics') & (df['price'] > 200),
['name', 'price', 'rating']
]
print(elec_expensive.head())
# 3. iloc:位置ベースの選択
print("\n=== 最初の3行、最初の4列 ===")
print(df.iloc[:3, :4])
# 4. ブール:複数条件
print("\n=== 高評価、在庫あり、100ドル以下 ===")
bargains = df[(df['rating'] >= 4.5) & (df['stock'] > 0) & (df['price'] < 100)]
print(bargains[['name', 'price', 'rating', 'stock']])
# 5. query:読みやすい複雑なフィルタ
print("\n=== Alphaブランドの電子製品またはホーム用品、評価4.0以上 ===")
query_result = df.query(
'brand == "Alpha" and category in ["Electronics", "Home"] and rating >= 4.0'
)
print(query_result[['name', 'category', 'rating']])
# 6. isin:複数値フィルタ
print("\n=== 指定ブランド ===")
top_brands = df[df['brand'].isin(['Alpha', 'Beta'])]
print(f"Alpha + Betaの商品数:{len(top_brands)}")
# 7. 安全な代入
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'In Stock'
print(f"\n=== 在庫状況 ===")
print(df['status'].value_counts())
TEXT
> 出力: ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていないため、ご自身のマシンにインストール(`pip install pandas`)してから進めてください。実際の値はpandasのバージョンによって若干異なる場合があります。
❓ よくある質問
Q locとilocの違いは何ですか?
A locはラベル(行名・列名)で選択し、スライスは終端を含みます。ilocは整数の位置で選択し、スライスは終端を含みません(Pythonスタイル)。名前がわかっているときはloc、位置がわかっているときはilocを使ってください。インデックスがデフォルトのRangeIndex(0,1,2...)の場合、loc[0]とiloc[0]は同じ結果を返しますが、意味は異なります。
Q 条件フィルタリングに括弧が必要な理由は何ですか?
A Pythonでは、& / | / ~ 演算子は比較演算子より優先順位が高いためです。
df['a'] > 1 & df['b'] < 2 は df['a'] > (1 & df['b']) < 2 と解釈され、エラーになります。必ず (df['a'] > 1) & (df['b'] < 2) と書いてください。and/or/notは使えません。配列レベルの要素ごとの操作をサポートしていないためです。Q チェーンインデックスの何が問題ですか?
A
df[condition][col] = value は2つの別々の操作です。最初の操作はビューまたはコピーを返す可能性があり、2番目のステップでコピーに代入しても元のDataFrameには影響しません。これにより「変更したのに反映されない」という見つけにくいバグが発生します。正しい書き方は df.loc[condition, col] = value で、行と列を一度に指定する単一操作です。Q queryは変数をサポートしていますか?
A はい。@を使って外部変数を参照できます:
df.query('price > @min_price')。スペースを含む列名にはバッククォートを使います:df.query('unit price > 100')。query内ではand/or/not/inなどのキーワードがサポートされており、自然言語に近い記述が可能です。Q isinと==の違いは何ですか?
A ==は単一の値にしかマッチできませんが、isinは複数の値に一度にマッチできます。
df[col].isin([v1,v2,v3]) は (df[col]==v1) | (df[col]==v2) | (df[col]==v3) と同等ですが、より簡潔で効率的です。否定が必要な場合は ~df[col].isin(...) を使ってください。Q 選択後の代入で注意すべき落とし穴は何ですか?
A 最大の落とし穴はチェーンインデックスです(FAQ #3を参照)。もう1つの落とし穴は、
df[df.a > 0] = 1 が行全体を1に設定してしまうことです(列aだけでなく)。正しい形式は df.loc[df.a > 0, 'a'] = 1 です。常にlocを使って行条件と対象の列を同時に指定してください。Q なぜlocのスライスは終端を含むのですか?
A これはPandasの設計上の選択です。ラベルでスライスする場合、終端は「ラベルAからラベルBまで」を意味し、両方を含む方が直感的です(辞書のキー範囲のように)。ilocによる位置のスライスはPythonの慣例に従います(終端を含まない)。覚えておいてください:locは「ラベルセマンティクス」、ilocは「Pythonセマンティクス」です。
📖 まとめ
- locはラベルで選択し、スライスは終端を含みます。ilocは位置で選択し、スライスは終端を含みません
- 条件フィルタリングにはブールインデックスを使い、複数条件は & / | / ~ で組み合わせます(括弧が必須です)
- queryメソッドは文字列の式を使い、SQLに近い可読性を提供し、@変数参照をサポートします
- isinは複数値のマッチングに使い、複数の==を|で組み合わせるより簡潔で効率的です
- チェーンインデックス
df[cond][col] = valは見つけにくいバグの原因になります。必ずdf.loc[cond, col] = valを使ってください - 文字列条件のフィルタリングには .str.contains() / .str.startswith() などのメソッドを使います
- 選択の判断:データの読み取り → loc/iloc/query/isin、代入 → loc[行条件, 列名]
📝 練習問題
- 基礎(難易度 ⭐):学生のDataFrame(name / math / english / science)を作成してください。locを使ってmathが80より大きい学生のname列とmath列を選択し、ilocを使って最初の3行を選択してください。
- 中級(難易度 ⭐⭐):同じデータを3つの方法(ブールインデックス / query / isin)でフィルタリングしてください:priceが50から200の間、かつcategoryがElectronicsまたはHome。コード量と可読性を比較してみてください。
- 挑戦(難易度 ⭐⭐⭐):50行の商品DataFrameを作成し、5つの選択演習を完成させてください:locで1行 / ilocでスライス / 複数条件のブール / 変数付きquery / isinで複数値。各選択の後、locを使って安全に新しいマーカー列を代入し、最後に各マーカーの集計を行ってください。



