PythonのPandasのスライスについて

AI実装検定のご案内

ここでは PythonのPandasにおける「スライス」操作 を、基礎から実践的な応用まで詳しく解説します。

特にDataFrameやSeriesに対してどうスライスできるのか、インデックスの種類による違い、よく使うパターンなどを整理していきます。

目次

Pandasでのスライスの基本

Pandasは、NumPyをベースにしているため、スライスの基本ルールはNumPy配列と似ています。

しかし、ラベルベースのアクセス(行・列名)位置ベースのアクセス(インデックス番号) の両方に対応しているのが特徴です。

代表的なアクセス方法

  • [](角括弧)
    • Seriesならインデックス指定で要素取得
    • DataFrameなら列名指定で列取得
  • .loc[] : ラベルベースのアクセス(行名や列名で指定)
  • .iloc[] : 位置ベースのアクセス(整数インデックスで指定)
  • .at[], .iat[] : 単一要素の高速アクセス

Seriesのスライス

まずは一次元のSeriesで確認してみます。

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50], index=["a", "b", "c", "d", "e"])
print(s)

位置ベースのスライス(Python標準と同じ)

s[1:4]

ラベルベースのスライス(終端を含む!)

s["b":"d"]

注意点:NumPyやPython標準のスライスは 終端を含まない が、locを使うラベルスライスは 終端を含む。これは初心者が混乱しやすいポイントです。

DataFrameのスライス

DataFrameは2次元なので「行のスライス」「列のスライス」の両方があります。

df = pd.DataFrame({
    "A": [1, 2, 3, 4, 5],
    "B": [10, 20, 30, 40, 50],
    "C": [100, 200, 300, 400, 500]
}, index=["a", "b", "c", "d", "e"])
print(df)

行のスライス

df[1:3]   # 位置ベース (Python標準と同じ)

列のスライス

df.loc[:, "A":"B"]  # ラベルで列範囲指定

.loc[].iloc[] の違い

これがPandasスライスで最も重要な点です。

.loc[](ラベルベース)

df.loc["b":"d", "A":"B"]

.iloc[](位置ベース)

df.iloc[1:4, 0:2]

応用的なスライス例

ステップ幅を指定

s[::2]   # 2つおきに取得

複数条件で絞り込み(真の「スライス」というよりフィルタ)

df[(df["A"] > 2) & (df["B"] < 50)]

行と列を同時に指定

df.loc["b":"d", ["A", "C"]]

よくあるエラーと注意点

  • KeyError : ラベル指定で存在しないインデックスを指定するとエラー
  • 範囲外アクセス : .ilocは範囲外のインデックスでエラー
  • ラベルと整数インデックスの混同
    • 例えば s[1:3] は位置ベース、s.loc[1:3] はラベルベース(終端含む)
  • コピーとビューの違い
    • スライス結果を変更すると元のDataFrameに反映される場合とされない場合がある(SettingWithCopyWarning)

まとめ

  • SeriesやDataFrameのスライスは「位置ベース」と「ラベルベース」で挙動が違う
  • locは終端を含む、ilocは終端を含まない
  • 行や列を同時にスライスできるのがPandas特有の強み
  • 条件指定と組み合わせると非常に強力なデータ抽出が可能

以上、PythonのPandasのスライスについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次