Python 使用str.contains时,是否有排除特定子字符串的方法? 出身背景

Python 使用str.contains时,是否有排除特定子字符串的方法? 出身背景,python,pandas,dataframe,Python,Pandas,Dataframe,我正在分析一个熊猫数据框架,其中包括不同食物配方的标题。我的目标是根据标题中的关键字为菜谱标题创建类别 例如: “麻辣面汤”属于汤类, “酸奶油苹果派”属于派类 我使用以下脚本为每个类别创建数据帧 df[df['title'].str.contains('Soup', na=False, case=False)] df[df['title'].str.contains('Pie', na=False, case=False)] 问题 我想排除字符串中包含关键字的特定配方。我想到的第一个例子是将

我正在分析一个熊猫数据框架,其中包括不同食物配方的标题。我的目标是根据标题中的关键字为菜谱标题创建类别

例如: “麻辣面汤”属于汤类, “酸奶油苹果派”属于派类

我使用以下脚本为每个类别创建数据帧

df[df['title'].str.contains('Soup', na=False, case=False)]
df[df['title'].str.contains('Pie', na=False, case=False)]
问题 我想排除字符串中包含关键字的特定配方。我想到的第一个例子是将“煎饼”从蛋糕类别中排除。虽然很多人会说煎饼是蛋糕,但我并不是为了做这个练习

一个非最优的解决方案是使用“蛋糕”作为子字符串,但是这将排除缺点,我想包括这些缺点

问题
使用str.contains方法时,有没有排除特定子字符串的方法?根据文档,似乎没有一种内置的方式我可能会出错

我能想到的一件事是用

当您有一个要排除的单词列表(如上所示)时,这种方法会更好地工作,因为您不需要控制蛋糕在单词中的相对位置

或者,如果您只有一个“煎饼”字来表示更简单的语法,请使用否定的后视:

df[df['title'].str.contains('(?<!pan)cake')]
输出:

        title
0  cheesecake
2     no cake

还可以包括排除值的条件。实现将是这样的。不过,它的实现成本有点高

import pandas as pd
raw_data = {'name': ['Willard Morris', 'Al Jennings', 'Chris Cook'],
'age': [20, 19, 18],
'favorite_food': ['Cake', 'Pancake', 'Ice Cream']}
df = pd.DataFrame(raw_data)

new_df = df[df['favorite_food'].str.contains('cake', na=False, case=False)
            & ~df['favorite_food'].isin(['Pancake'])]

print ('raw-data df')
print (df)

print ('\nfiltered df for cake')
print (new_df)
其输出将为:

raw-data df
             name  age favorite_food
0  Willard Morris   20          Cake
1     Al Jennings   19       Pancake
2      Chris Cook   18     Ice Cream

filtered df for cake
             name  age favorite_food
0  Willard Morris   20          Cake

你可以做“蛋糕”,但是你会错过“短蛋糕”。是的,我在问题中提到了这一点。你也可以使用nltk词汇语料库制作一包可接受或不可接受的词汇。谢谢!这工作得很好,我还测试了其他的前缀&多个前缀同时被排除在外,它工作得很好。
import pandas as pd
raw_data = {'name': ['Willard Morris', 'Al Jennings', 'Chris Cook'],
'age': [20, 19, 18],
'favorite_food': ['Cake', 'Pancake', 'Ice Cream']}
df = pd.DataFrame(raw_data)

new_df = df[df['favorite_food'].str.contains('cake', na=False, case=False)
            & ~df['favorite_food'].isin(['Pancake'])]

print ('raw-data df')
print (df)

print ('\nfiltered df for cake')
print (new_df)
raw-data df
             name  age favorite_food
0  Willard Morris   20          Cake
1     Al Jennings   19       Pancake
2      Chris Cook   18     Ice Cream

filtered df for cake
             name  age favorite_food
0  Willard Morris   20          Cake