1 回答
![?](http://img1.sycdn.imooc.com/54584cfb0001308402200220-100-100.jpg)
TA贡献1884条经验 获得超4个赞
np.nan == np.nan是假的。也许有点违反直觉=)但这应该意味着最后一个条件永远不应该生效。从你的问题中不清楚你是否看到相同的结果或没有结果。
如果你改变了
for i, description in enumerate(test3['description']):
到
for i, description in zip(test3.loc[test3['manufacturer'].isna(), :].index, test3.loc[test3['manufacturer'].isna(), 'description']):
那么我认为它应该可以正常工作。您只会获得“制造商”为 NaN 的行。您也可以删除该== np.nan部分,因为非空字符串的计算结果为 True,而 np.nan 的计算结果为 False,但这会使您的代码更难理解。
有很多方法可以让你的代码看起来更好;)但是专注于学习调试,剩下的就会水到渠成。只要它能做你想做的事,谁在乎呢。
调试此问题的一种方法是打印循环内条件每个部分的真值。
print(bool(word.lower() in keyword))
print(bool(test3.loc[i, 'manufacturer'] == np.nan)
最好的祝愿!
编辑:好的,我可能应该添加我自己如何做到这一点。
df = pd.DataFrame({'manufacturer': ['toyota', np.nan, np.nan, np.nan],
'description': ['toyota, gmc 10 years old.', 'gmc, Motor runs and drives good.', 'Motor old, in pieces.', '2 owner 0 rust. Cadillac.']})
keyword = ['gmc', 'toyota', 'cadillac']
filler = df['description'].map(lambda s: [word for word in keyword if word in s.lower()][0]
if bool([word for word in keyword if word in s.lower()])
else np.nan)
df['manufacturer'] = df['manufacturer'].fillna(filler)
当关键字中的最后一项或第一项出现在字符串中时,不确定您是否想要关键字中的最后一项或第一项。我使用索引 0 将其设置为此处的第一项。
添加回答
举报