卡住了 ForLoop 并插入 DataFrame

我有这个数据框:


    manufacturer    description

0   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    description

0   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 re

keyword = ['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  description

0   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:

它没有任何效果。


PIPIONE
浏览 88回答 1
1回答

智慧大石

这是一个快速修复。你做错了几件事:混淆了描述索引和描述本身(通过 解决enumerate())。bag_of_words应该对每个单词进行更新,而不是附加。正在迭代错误的项目(应该是word,不是bag_of_words)。如果选择直观/常规的名称,则可以很容易地看出一些错误。一定要花一些时间在这上面。代码:from nltk.tokenize import RegexpTokenizer# test3 = the main datasetkeyword = ['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输出:test3Out[31]:   manufacturer                       description0       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 apostrophesre.findall(r"""[A-Za-z\-]+""", test3["description"][3])# the output is much cleaner than beforeOut[39]: ['owner', 'rust', 'Cadillac']但这取决于用户根据整个任务的选择。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python