如何在熊猫列中搜索单词

时间:2019-05-17 18:44:52

标签: python pandas

我有一个带有评论的pandas数据框,我想在所有列中搜索特定的单词。

df["Summary"].str.lower().str.contains("great", na=False)

这给出的结果为true或false,但是我想创建一个在相应行中写入1或0的新列。

例如,如果评论中包含“伟大”,则应给出1,而不是2。 我尝试过:

if df["Summary"].str.lower().str.contains("great", na=False) == True:
    df["Great"] = '1'
else:
    df["Great"] = '0'

出现此错误:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。我该怎么解决?

3 个答案:

答案 0 :(得分:2)

由于True / False对应于1/0,因此您只需进行astypeboolint的转换:

df['Great'] = df["Summary"].str.contains("great", case=False, na=False).astype(int)

还请注意,我已删除了str.lower调用,并添加了case=False作为str.contains的参数,以进行不区分大小写的比较。


另一种解决方案是先小写然后禁用正则表达式匹配以提高性能。

df['Great'] = (df["Summary"].str.lower()
                            .str.contains("great", regex=False, na=False)
                            .astype(int))

最后,您还可以使用列表理解:

df['Great'] = [1 if 'great' in s.lower() else 0 for s in df['Summary']]

如果您还需要处理数字数据,请使用

df['Great'] = [
    1 if isinstance(s, str) and 'great' in s.lower() else 0 
    for s in df['Summary']
]

在我的这篇文章中,我详细介绍了对对象数据厌恶的列表理解的优点:For loops with pandas - When should I care?

答案 1 :(得分:2)

您的状况     df [“ Summary”]。str.lower()。str.contains(“ great”,na = False)

将返回一系列True或False值。它不等于“ True”,因为系列不是python布尔值。 相反,您可以这样做来实现所需的目标

df['Great'] = df['Summary'].apply(lambda x: 'great' in x.lower())

答案 2 :(得分:0)

使用numpy

的可能解决方案
import numpy as np
df["Great"] = np.where(df["Summary"].str.lower().contains("great", na=False), '1', '0')

查看文档here