PythonでDataFrameから回文名をフィルタリングする方法【2つの解法を解説】
pandasのデータフレーム(DataFrame)に含まれる名前の中から、回文(前から読んでも後ろから読んでも同じになる文字列)となっているものを抽出する方法を、2つの異なるアプローチで解説します。
実行結果のイメージ
回文名を抽出して表示すると、以下のような結果が得られます。
回文名は以下の通りです:
Id Name
0 1 bob
2 3 hannah
解法1:リスト内包表記を使う方法
まず、データフレームを定義します。
リスト内包表記を使用し、forループで
df['Name']列のすべての値に変数iでアクセスします。if条件で「i == i[::-1]」つまり文字列を逆順にしても元と同じかどうかを判定し、条件を満たす値だけをリストに追加します。
l = [i for i in df['Name'] if(i==i[::-1])]
最後に、
isin()メソッドを使って、作成したリスト内の値がdf['Name']列に存在するかを確認し、該当する行のみを抽出します。
df[df['Name'].isin(l)]
コード例
以下のコードを実行すると、処理の流れをより深く理解できます。
import pandas as pd
data = {'Id':[1,2,3,4,5],'Name':['bob','peter','hannah','james','david']}
df = pd.DataFrame(data)
print("DataFrame is:\n", df)
l = [i for i in df['Name'] if(i==i[::-1])]
print("Palindrome names are:\n", df[df['Name'].isin(l)])
出力結果
DataFrame is:
Id Name
0 1 bob
1 2 peter
2 3 hannah
3 4 james
4 5 david
Palindrome names are:
Id Name
0 1 bob
2 3 hannah
解法2:lambdaとfilter関数を使う方法
まず、データフレームを定義します。
filter()関数にlambda式を適用し、df['Name']の各値がreversed()関数で逆順にした結果と一致するかどうかを比較します。一致した値だけを結果のリストとして格納します。
result = list(filter(lambda x:(x=="".join(reversed(x))),df['Name']))
最後に、解法1と同様に
isin()メソッドを使って、リスト内の値がdf['Name']列に存在するかを確認し、該当行を抽出します。
df[df['Name'].isin(result)]
コード例
以下のコードを実行すると、動作をより深く理解できます。
import pandas as pd
data = {'Id':[1,2,3,4,5],'Name':['bob','peter','hannah','james','david']}
df = pd.DataFrame(data)
print("DataFrame is:\n", df)
result = list(filter(lambda x:(x=="".join(reversed(x))),df['Name']))
print("Palindrome names are:\n", df[df['Name'].isin(result)])
出力結果
DataFrame is: Id Name 0 1 bob 1 2 peter 2 3 hannah 3 4 james 4 5 david Palindrome names are: Id Name 0 1 bob 2 3 hannah
補足:スライス記法 [::-1] について
i[::-1] はPythonのスライス記法で、文字列を逆順に並べ替えた新しい文字列を返します。ステップに -1 を指定することで、末尾から先頭へと逆方向に要素を取得できます。この性質を利用すれば、元の文字列と比較するだけで簡単に回文判定が可能です。
まとめ
どちらの解法も結果は同じですが、リスト内包表記は簡潔で可読性が高く、lambda+filter関数は関数型プログラミングのスタイルに慣れている方に向いています。用途やチームのコーディング規約に応じて使い分けるとよいでしょう。
-
PythonでDataFrameから成績が「A」の生徒の名前を抽出する方法
pandasのDataFrameから特定の条件に一致する行だけを取り出すことは、データ分析における最も基本的な操作の一つです。この記事では、「Id」「Name」「Grade」の3列を持つ生徒データのDataFrameから、成績(Grade)が「A」の生徒の名前のみを抽出するプログラムを、ブールインデックス参照を使って実装する方法を解説します。 入力データと期待される出力 まず、以下のようなDataFrameを想定します。 Id Name Grade 0 1 stud1 A 1 2 stud2 B 2 3 stud3 C 3 4 stud
-
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