ここでは 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のスライスについてでした。
最後までお読みいただき、ありがとうございました。