检查 Pandas DataFrame 列中的字符串是不是在字符串列表中
Posted
技术标签:
【中文标题】检查 Pandas DataFrame 列中的字符串是不是在字符串列表中【英文标题】:Check if a string in a Pandas DataFrame column is in a list of strings检查 Pandas DataFrame 列中的字符串是否在字符串列表中 【发布时间】:2013-08-01 03:06:32 【问题描述】:如果我有这样的框架
frame = pd.DataFrame(
"a": ["the cat is blue", "the sky is green", "the dog is black"]
)
我想检查这些行是否包含某个单词,我只需要这样做。
frame["b"] = (
frame.a.str.contains("dog") |
frame.a.str.contains("cat") |
frame.a.str.contains("fish")
)
frame["b"]
输出:
0 True
1 False
2 True
Name: b, dtype: bool
如果我决定列出一个清单:
mylist = ["dog", "cat", "fish"]
如何检查行是否包含列表中的某个单词?
【问题讨论】:
接受的答案中的方法会找到,例如,单词“there”中的子字符串“the”。有关查找 exact 单词的方法,请参见此处:Creating a new column by finding exact word in a column of strings 【参考方案1】:frame = pd.DataFrame('a' : ['the cat is blue', 'the sky is green', 'the dog is black'])
frame
a
0 the cat is blue
1 the sky is green
2 the dog is black
str.contains
方法接受正则表达式模式:
mylist = ['dog', 'cat', 'fish']
pattern = '|'.join(mylist)
pattern
'dog|cat|fish'
frame.a.str.contains(pattern)
0 True
1 False
2 True
Name: a, dtype: bool
由于支持正则表达式模式,您还可以嵌入标志:
frame = pd.DataFrame('a' : ['Cat Mr. Nibbles is blue', 'the sky is green', 'the dog is black'])
frame
a
0 Cat Mr. Nibbles is blue
1 the sky is green
2 the dog is black
pattern = '|'.join([f'(?i)animal' for animal in mylist]) # python 3.6+
pattern
'(?i)dog|(?i)cat|(?i)fish'
frame.a.str.contains(pattern)
0 True # Because of the (?i) flag, 'Cat' is also matched to 'cat'
1 False
2 True
【讨论】:
这大大加快了我的工作速度。有什么方法可以返回匹配的子模式(例如,dog)而不是 True False? 想通了:返回匹配的模式使用frame.a.str.extract(pattern)
@Andy Hayden 如何在输出为真的情况下打印模式值
@Andy Hayden 不是它不起作用尝试它给出值错误。你能推荐点别的吗?
我的意思是预期的输出应该是 True Cat 等,而不是 True 单独【参考方案2】:
列表应该可以工作
print(frame[frame["a"].isin(mylist)])
见pandas.DataFrame.isin()
。
【讨论】:
即使您正在从列表中寻找潜在的子字符串,这也能工作吗?也就是说,如果您想将列 'a' 的任何子字符串与 mylist 中的任何元素匹配,这会捕获它吗? 不,它不适用于子字符串。它只匹配整个字符串并且区分大小写。【参考方案3】:在通过提取字符串的接受答案的cmets之后,也可以尝试这种方法。
frame = pd.DataFrame('a' : ['the cat is blue', 'the sky is green', 'the dog is black'])
frame
a
0 the cat is blue
1 the sky is green
2 the dog is black
让我们创建一个列表,其中包含需要匹配和提取的字符串。
mylist = ['dog', 'cat', 'fish']
pattern = '|'.join(mylist)
现在让我们创建一个函数来负责查找和提取子字符串。
import re
def pattern_searcher(search_str:str, search_list:str):
search_obj = re.search(search_list, search_str)
if search_obj :
return_str = search_str[search_obj.start(): search_obj.end()]
else:
return_str = 'NA'
return return_str
我们将在 pandas.DataFrame.apply 中使用这个函数
frame['matched_str'] = frame['a'].apply(lambda x: pattern_searcher(search_str=x, search_list=pattern))
结果:
a matched_str
0 the cat is blue cat
1 the sky is green NA
2 the dog is black dog
【讨论】:
pattern_searcher()
也会在字符串中返回这些字符。例如,catastrophe
也将返回 cat
。 hotdog
将返回 dog
另外,如果mylist = ['dog', 'cat', 'fish', dogs]
,函数会按顺序识别。例如,dogs are cool
将返回 dog
而不是 dogs
。【参考方案4】:
例如,我们可以使用管道同时检查三种模式
for i in range(len(df)):
if re.findall(r'car|oxide|gen', df.iat[i,1]):
df.iat[i,2]='Yes'
else:
df.iat[i,2]='No'
【讨论】:
以上是关于检查 Pandas DataFrame 列中的字符串是不是在字符串列表中的主要内容,如果未能解决你的问题,请参考以下文章
检查pandas [duplicate]中的dataframe列中是否包含某个值
从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]
pandas移除dataframe字符串数据列中的后N个字符(remove the last n characters from values from column of dataframe)
pandas移除dataframe字符串数据列中的前N个字符(remove the first n characters from values from column of dataframe)
pandas使用replace函数将dataframe指定数据列中的特定字符串进行自定义替换(replace substring in dataframe column values)