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

通过 DataFrame 中的 ForLoop 赋值

通过 DataFrame 中的 ForLoop 赋值

四季花海 2023-10-06 18:50:04
我有一个这样的数据库:manufacturer  cylinders    description0   toyota   5 cylinders   toyota, gmc 10 years old.1   NaN          NaN       gmc, Motor runs and drives good.2   NaN          NaN       Motor old, in pieces. 4 cylinders3   NaN     12 cylinders   2 owner 0 rust. Cadillac.还有这组关键词:manufacturer = ['gmc', 'toyota', 'cadillac']cylinders = ['12 cylinders', '4 cylinders', '5 cylinders']我想创建一个程序来读取描述并根据所需的关键字向每列添加正确的信息。理想情况下,它看起来像这样:    manufacturer  cylinders   description0   toyota      5 cylinders   toyota, gmc 10 years old.1   gmc             NaN       gmc, Motor runs and drives good.2   NaN         4 cylinders   Motor old, in pieces. 4 cylinders3   cadillac   12 cylinders   2 owner 0 rust. Cadillac.一直在尝试一切,但似乎没有任何效果。这是我为了将单词添加到一列而尝试的方法,但我需要将其更改为多个列,并且该程序会更改值,即使它不是 NaN(fe 将“toyota”更改为“gmc”),这是我不想要的。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()我知道如何解决这个问题吗?谢谢。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

无需使用 for 循环。相反,您可以使用pandas矢量化函数。

  1. 您可以与库fillna()一起使用。本质上,您正在用从描述列中提取的信息替换值。.str.extract()pandasNaN

  2. 您可以传递一个标志,flags=re.IGNORECASE以在匹配时忽略大小写。

  3. 最后,我们必须使用, expand=False返回一个系列,因为返回一个数据帧,这在处理数据帧而不是系列str.extract()时会导致错误。.fillna()

import pandas

import re

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

df['manufacturer'] = df['manufacturer'].fillna(

    df['description'].str.extract('(gmc|toyota|cadillac)', flags=re.IGNORECASE, expand=False))

df['cylinders'] = df['cylinders'].fillna(

    df['description'].str.extract('(\d+\s+cylinders?)', flags=re.IGNORECASE, expand=False))

df

Out[1]: 

  manufacturer     cylinders                        description

0       toyota   5 cylinders          toyota, gmc 10 years old.

1          gmc           NaN   gmc, Motor runs and drives good.

2          NaN   4 cylinders  Motor old, in pieces. 4 cylinders

3     Cadillac  12 cylinders          2 owner 0 rust. Cadillac.

如果您需要输出为小写,您可以将str.lower()或添加str.casefold()到每列上面每行代码的末尾。操作与符号和不同语言casefold()类似lower(),但更可靠。


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

添加回答

举报

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