通过 DataFrame 中的 ForLoop 赋值

我有一个这样的数据库:


manufacturer  cylinders    description

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

3   NaN     12 cylinders   2 owner 0 rust. Cadillac.

还有这组关键词:


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

cylinders = ['12 cylinders', '4 cylinders', '5 cylinders']

我想创建一个程序来读取描述并根据所需的关键字向每列添加正确的信息。理想情况下,它看起来像这样:


    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.

一直在尝试一切,但似乎没有任何效果。这是我为了将单词添加到一列而尝试的方法,但我需要将其更改为多个列,并且该程序会更改值,即使它不是 NaN(fe 将“toyota”更改为“gmc”),这是我不想要的。


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()

我知道如何解决这个问题吗?谢谢。


四季花海
浏览 90回答 1
1回答

元芳怎么了

无需使用 for 循环。相反,您可以使用pandas矢量化函数。您可以与库fillna()一起使用。本质上,您正在用从描述列中提取的信息替换值。.str.extract()pandasNaN您可以传递一个标志,flags=re.IGNORECASE以在匹配时忽略大小写。最后,我们必须使用, expand=False返回一个系列,因为返回一个数据帧,这在处理数据帧而不是系列str.extract()时会导致错误。.fillna()import pandasimport rekeyword = ['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))dfOut[1]:   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.如果您需要输出为小写,您可以将str.lower()或添加str.casefold()到每列上面每行代码的末尾。操作与符号和不同语言casefold()类似lower(),但更可靠。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python