检查pandas dataframe列中的字符串是否在列表中

时间:2013-07-31 14:18:28

标签: python python-2.7 pandas

如果我有这样的框架

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']输出:

True
False
True

如果我决定列出

mylist =['dog', 'cat', 'fish']

如何检查列中是否包含某个单词?

4 个答案:

答案 0 :(得分:63)

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

答案 1 :(得分:7)

列表应该有效

print frame[frame['a'].isin(mylist)]     

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html

答案 2 :(得分:3)

在对提取字符串的公认答案进行评论之后,也可以尝试这种方法。

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

答案 3 :(得分:0)

例如,我们可以使用管道同时检查三种模式

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'