【Python】pandasのSeriesから「a」で始まり「a」で終わる文字列を抽出する2つの方法
pandasのSeriesに格納された文字列の中から、「a」で始まり、かつ「a」で終わる要素だけを抽出する方法を解説します。正規表現を使う方法と、組み込み関数filter()を使う方法の2通りを、実際のコード例とともに紹介します。
入力データと出力結果
まず、以下のようなSeriesを例として考えてみましょう。
0 apple 1 oranges 2 alpha 3 aroma 4 beta
このSeriesから「a」で始まり「a」で終わる要素を抽出すると、結果は次のようになります。
2 alpha 3 aroma
解法1: 正規表現を使う方法
手順
Seriesを定義します。
先頭と末尾が「a」であることを判定するための正規表現を作成します。
空のリストを用意し、forループの中でif条件を使って各要素がパターンに一致するかどうかをチェックします。
最後にisin()メソッドを使って、一致した要素のみのSeriesを取得します。
使用する正規表現は以下のとおりです。
r'^[a]$|^([a]).*\1$'
このパターンは「1文字のみの 'a'」または「'a'で始まり'a'で終わる文字列」にマッチします。
実装例
それでは、実際のコードを見てみましょう。
import pandas as pd import re l = ["apple", "oranges", "alpha", "aroma", "beta"] data = pd.Series(l) exp = r'^[a]$|^([a]).*\1$' ls = [] for i in data: if(re.search(exp, i)): ls.append(i) print(data[data.isin(ls)])
出力
2 alpha 3 aroma
解法2: filter()とlambdaを使う方法
よりシンプルで読みやすい方法として、組み込み関数filter()とlambda式を組み合わせるやり方があります。文字列メソッドのstartswith()とendswith()を使って条件を判定するため、正規表現を書く必要がありません。
実装例
import pandas as pd
import re
l = ["apple", "oranges", "alpha", "aroma", "beta"]
data = pd.Series(l)
result = list(filter(lambda x: x.startswith('a') and x.endswith('a'), l))
print(data[data.isin(result)])出力
2 alpha 3 aroma
まとめ
どちらの方法でも同じ結果が得られます。正規表現を使う解法1は、複雑なパターンマッチングにも柔軟に対応できるのが特徴です。一方、解法2はstartswith()とendswith()を直接使うため、コードの意図が分かりやすく保守性に優れています。単純な前方・後方一致であれば解法2を、より高度な条件が必要な場合は解法1を選ぶとよいでしょう。
-
PythonでpandasのSeriesから整数要素のみを抽出・フィルタリングする方法
文字列と整数が混在するpandasのSeriesから、整数要素のみを抽出する方法を、2つの異なるアプローチで解説します。 入力データと期待される出力 入力 ― 次のようなSeriesを想定します。 0 1 1 2 2 python 3 pandas 4 3 5 4 6 5 出力 ― 整数要素のみを抽出した結果は以下の通りです。 0 1 1 2 4 3 5 4 6 5 解法1:type()でデータ型を判定する pandasのSeriesを定義します。 forループとitems()メソッドでインデックスと値を順番に取り
-
Pythonでpandas Seriesから有効な日付だけをフィルタリングする方法
データ分析では、文字列として格納された日付の中から、正しい形式の日付だけを抽出したい場面がよくあります。この記事では、Pythonのpandasと正規表現(reモジュール)を使って、Series内から「YYYY-MM-DD」形式の有効な日付だけをフィルタリングする方法を2通り紹介します。 入力データと期待される出力 次のようなSeriesがあると仮定します。 0 2010-03-12 1 2011-3-1 2 2020-10-10 3 11-2-2 この中で「年4桁・月2桁・日2桁」という形式に合致する有効な日付は、以下の2つです。 0 2010-0