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

卡住了 ForLoop 并插入 DataFrame

卡住了 ForLoop 并插入 DataFrame

PIPIONE 2023-10-06 16:44:57
我有这个数据框:    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 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

这是一个快速修复。你做错了几件事:

  • 混淆了描述索引和描述本身(通过 解决enumerate())。

  • bag_of_words应该对每个单词进行更新,而不是附加。

  • 正在迭代错误的项目(应该是word,不是bag_of_words)。

如果选择直观/常规的名称,则可以很容易地看出一些错误。一定要花一些时间在这上面。

代码

from nltk.tokenize import RegexpTokenizer


# test3 = the main dataset

keyword = ['gmc', 'toyota', 'cadillac']


tokenizer = RegexpTokenizer('\w+|\$[\d\.]+|\S+')


for i, description in enumerate(test3['description']):

    bag_of_words = tokenizer.tokenize(description.lower())

    for word in bag_of_words:

        if word in keyword:

            test3.loc[i, 'manufacturer'] = word

输出:


test3

Out[31]: 

  manufacturer                       description

0       toyota             toyota, 10 years old.

1          gmc  gmc, Motor runs and drives good.

2          NaN             Motor old, in pieces.

3     cadillac         2 owner 0 rust. Cadillac.

通过 RegexpTokenizer 进行 re.findall()

我个人认为nltk是一个需要导入、安装和部署的比较重的模块。如果只进行字符串分割,我建议使用re.findall来提取有效的单词模式。例如:


import re


# won't extract numbers, currency signs and apostrophes

re.findall(r"""[A-Za-z\-]+""", test3["description"][3])


# the output is much cleaner than before

Out[39]: ['owner', 'rust', 'Cadillac']

但这取决于用户根据整个任务的选择。


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

添加回答

举报

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