【Python】pandasで取得したDataFrameのデータに対して、特定文字が含まれるかのチェックを行う

pandasで取得したDataFrameのデータに対して、特定文字が含まれるかのチェックを行う

Excelファイル形式のデータをpandasライブラリを読み込み、データの中に特定の文字列を含むかどうかをチェックする方法について調べました(ChatGPTが)

列単位でチェックする方法

単純に、特定の列のデータに対して文字列を含むかどうかを調べたいだけであれば isin を使うのが最も手っ取り早そうです。

# 例:Excelの中身(df) # name city # 0 Alice Tokyo # 1 Bob Osaka # 2 Charlie Nagoya # 比較したいリスト check_list = ["Tokyo", "Osaka", "Fukuoka"] # サンプルコード df["city"].isin(check_list) # 実行結果 0 True 1 True 2 False Name: city, dtype: bool

isinを使うことで、行ごとに文字を含むかどうかの真偽値が返却されます。

1セルごとにチェックする方法

今回は某アプリケーションのアウトプットを想定して、アプリケーション名に含まれているベンダー名、製品名、バージョンを取得して、不足している列の情報を保管したかったことから、1セル単位でチェックをすることにしました。
理想のインプットは、ベンダー名、製品名、バージョンが全て補完されているデータなのですが、某製品は情報にばらつきがあり、アプリケーション名という項目にベンダー名+製品名+バージョンみたいなデータ管理がされているデータもあり、そのようなケースにおいてアプリケーション名から可能な限り先の情報を取得することが目的です。
某アプリケーションの詮索はやめてください(笑

# 製品情報一覧の内容を1行ずつ取得して補完処理を行う。 for index, row in editdatas.iterrows(): appname = row[headers[self.HEADER_APPNAME]] vender = row[headers[self.HEADER_VENDER]] # ベンダー名が未編集の場合は補完を行う。 if vender.strip() == "": # venderlist から一つずつデータを取得 for sample in venderlist: # vender に sample の文字列が含まれるかどうかを比較 # 全て小文字に変換した上で比較を行う if sample.lower() in appname.lower(): editdatas.loc[index,headers[self.HEADER_VENDER]] = sample break

やっていることは相当アナログで、まずiterrowsで1行ずつデータを取得します。
その後、appname(アプリケーション名)列の情報を取得して、NVDのCPEから取得したベンダー名の一覧と付き合わせし、CPEのベンダー名を含む文字列があったら、ベンダー名を「ベンダー名」列に編集するという方法です。
まだ動かしていないのですが、パフォーマンスが相当悪いことが予想されます。
今日は脳みそが働いていないので、改善方法は後日考えます。(現実逃避)

コメント

このブログの人気の投稿

【python】PySide6 におけるウィンドウとかダイアログボックス内のアイテムの自動調整

脆弱性評価システムを作る〜CVSSとは〜

dict型オブジェクトを内包するlistオブジェクトのコピー