我有一个带有评论的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()。我该怎么解决?
答案 0 :(得分:2)
由于True / False对应于1/0,因此您只需进行astype
从bool
到int
的转换:
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。