PandasのSeries
データを絞り込む方法にはさまざまな手段があります。
ここでは以下の観点から詳しく解説します。
Seriesの基本構造と準備
まず、PandasのSeries
は1次元のデータ構造です。
ラベル(インデックス)と値のペアで構成されます。
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50], index=["a", "b", "c", "d", "e"])
print(s)
a 10
b 20
c 30
d 40
e 50
dtype: int64
値による絞り込み(ブールインデックス)
最も基本的な絞り込み方法は「条件式によるブールインデックス」です。
# 30以上の値だけを取り出す
filtered = s[s >= 30]
print(filtered)
c 30
d 40
e 50
dtype: int64
これは、s >= 30
という条件に該当する値のインデックスだけを残す方法です。
条件を組み合わせた絞り込み
複数条件を組み合わせるには、&
(かつ)や|
(または)を使います。
# 20以上かつ40以下の値
s_filtered = s[(s >= 20) & (s <= 40)]
print(s_filtered)
注意点:括弧で条件全体を囲まないとエラーになります(ValueError: The truth value of a Series is ambiguous
)。
isin()
による複数の特定値でのフィルタ
特定の値だけを取り出したいときには、isin()
を使います。
# 値が20または50のデータを取得
s_filtered = s[s.isin([20, 50])]
print(s_filtered)
b 20
e 50
dtype: int64
isin()
はリストのようなコレクションを引数にとり、True/FalseのブールSeriesを返します。
str
アクセサを用いた文字列のフィルタ(文字列Series)
Seriesが文字列で構成されている場合は、.str
アクセサを使うと便利です。
# 文字列Seriesの例
s_str = pd.Series(["apple", "banana", "cherry", "avocado", "blueberry"])
# "a"で始まるものを抽出
filtered = s_str[s_str.str.startswith("a")]
print(filtered)
0 apple
3 avocado
dtype: object
他にも.contains()
や.endswith()
なども使えます。
between()
による範囲指定の簡略表記
数値範囲の絞り込みに便利なbetween()
メソッドもあります。
# 20〜40の間のデータ(両端を含む)
s_filtered = s[s.between(20, 40)]
print(s_filtered)
b 20
c 30
d 40
dtype: int64
読みやすく、直感的です。
query()
との違い
DataFrame
では.query()
を使った絞り込みができますが、Series
では基本的にサポートされていません(Pandas 2.2時点ではSeries.query()
は存在しません)。
従って、Seriesの場合はブールインデックスやメソッドを使う必要があります。
loc・ilocとの併用
Series
でもloc
やiloc
を使って、インデックスの値や位置による絞り込みが可能です。
# ラベルが 'a' から 'c' の範囲
print(s.loc["a":"c"])
# 位置が 1 から 3 の要素
print(s.iloc[1:4])
loc
はラベルベース(名前)で、iloc
は位置ベース(インデックス番号)で指定します。
まとめ
方法 | 用途 | 例 |
---|---|---|
s[条件] | 基本的な絞り込み | s[s > 30] |
& , ` | , ~` | 条件の組み合わせ |
isin() | 複数の一致する値で絞り込み | s[s.isin([20, 50])] |
between() | 数値範囲の簡易フィルタ | s[s.between(20, 40)] |
str.contains() , etc. | 文字列に対するフィルタ | s_str[s_str.str.contains("berry")] |
loc , iloc | インデックス・位置での抽出 | s.loc["a":"c"] / s.iloc[1:3] |
以上、PandasのSeriesのデータを絞り込む方法についてでした。
最後までお読みいただき、ありがとうございました。