为了账号安全,请及时绑定邮箱和手机立即绑定

在 DataFrame 中添加 NaN 值时出现问题

在 DataFrame 中添加 NaN 值时出现问题

德玛西亚99 2023-10-11 21:17:39
我有这个数据框:    manufacturer    description0   toyota          toyota, gmc 10 years old.1   NaN             gmc, Motor runs and drives good.2   NaN             Motor old, in pieces.3   NaN             2 owner 0 rust. Cadillac.我想用从描述中获取的关键字填充 NaN 值。为此,我创建了一个包含我想要的关键字的列表:keyword = ['gmc', 'toyota', 'cadillac']最后,我想循环 DataFrame 中的每一行。将内容从每行的“描述”列中拆分出来,如果该单词也在“关键字”列表中,则将其添加到“制造商”列中。例如,它看起来像这样:    manufacturer    description0   toyota          toyota, gmc 10 years old.1   gmc             gmc, Motor runs and drives good.2   NaN             Motor old, in pieces.3   cadillac        2 owner 0 rust. Cadillac.感谢这个社区中的某人,我可以将我的代码改进为:import rekeyword = ['gmc', 'toyota', 'cadillac']bag_of_words = []for i, description in enumerate(test3['description']):bag_of_words = re.findall(r"""[A-Za-z\-]+""", test3["description"][i])for word in bag_of_words:     if word.lower() in keyword:            test3.loc[i, 'manufacturer'] = word.lower()但我意识到第一行也改变了值,即使它不是 NaN:  manufacturer  description0   gmc         toyota, gmc 10 years old.1   gmc         gmc, Motor runs and drives good.2   NaN         Motor old, in pieces.3   cadillac    2 owner 0 rust. Cadillac.我只想更改 NaN 值,但是当我尝试添加时:if word.lower() in keyword and test3.loc[i, 'manufacturer'] == np.nan:它没有任何效果。
查看完整描述

1 回答

?
慕村9548890

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 将其设置为此处的第一项。


查看完整回答
反对 回复 2023-10-11
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信