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

2024-04-26 06:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

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

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

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

df[df['title'].str.contains('Soup', na=False, case=False)]
df[df['title'].str.contains('Pie', na=False, case=False)]

问题

我想排除字符串中包含关键字的特定配方。想到的第一个例子是将“煎饼”从蛋糕类中排除。虽然很多人会说煎饼是蛋糕,但我不是为了做这个练习:)

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

问题

在使用str.contains()方法时,有没有排除特定子字符串的方法?根据文档,似乎没有内置的方式(我可能错了)


Tags: 数据字符串false标题dftitle配方关键字
2条回答

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

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

我能想到的一件事是用''替换该特定字符串

exclude_words = ['pancake', 'cakefake']

df[df['title'].replace(exclude_words,'', regex=True)
              .str.contains('cake', case=False)
  ]

如果您有一个要排除的单词列表(如上图所示),那么这种方法将工作得更好,因为您不需要控制cake在单词中的相对位置

或者,如果只有一个'pancake'字,则使用否定查找来简化语法:

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

测试数据:

df = pd.DataFrame({'title':['cheesecake', 'pancake','no cake']})

输出:

        title
0  cheesecake
2     no cake

相关问题 更多 >

    热门问题