上流SEが久しぶりに開発してみる日記

マネジメント専任システムエンジニアがなれないプログラミングをしてみる日記です。

python データフレームの特定のカラムに特定の文字列リストが含まれるものを抽出する(部分一致、リスト検索)

ぜったいにもっと簡単にやり方とか関数があると確信していますが、

なかなか見つからなかったのでメモ。

 

 

データフレームの特定のカラムを一定の条件で検索したい。

 

その条件とは特定の文字列のリストがあって、それがふくまれるものを抽出するというもの。

 

ポイントは完全一致でなく、部分一致であること。

検索したい文字列が一つではなく複数あること。

 

 

こんな感じです。

 

■コード

import pandas as pd
import numpy as np


data = ["A1","B2","C3","C1"]
df = pd.DataFrame(data=data, columns=['label'])

#1と3を含むデータを抜きたい
#containsはlistを指定できない。
#isinは完全一致しかできない。。
#というわけで、こんなめんどくさいことをやる。。。

#検索したい文字列のリスト
stringlist = ["1","3"]

indexlist = []

#検索したい文字列を1件ずつループ。含まれていた場合のインデックスをリストに追加していく。
for i in range(len(stringlist)):
    indexlist.extend(df.index[df['label'].str.contains(stringlist[i])].tolist())

#出力したリストをそのまま使うと重複あるので、重複排除して、ソート。
#unique使うと勝手にソートされてしまうが、今回は好都合。
label_list = np.unique(indexlist).tolist()

print("対象を含むデータの抽出")
print(df.reindex(index=label_list))

print("対象を含まないデータの抽出")
print(df.drop(index=label_list))

 

 

■出力結果

対象を含むデータの抽出
  label
0    A1
2    C3
3    C1
対象を含まないデータの抽出
  label
1    B2