【问题标题】:Assigning value over a ForLoop in DataFrame在 DataFrame 中的 For 循环上赋值
【发布时间】:2021-01-20 19:35:48
【问题描述】:

我有一个这样的数据库:

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

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

【问题讨论】:

    标签: python pandas dataframe for-loop nan


    【解决方案1】:

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

    1. 您可以将fillna().str.extract()pandas 库一起使用。本质上,您是用从描述列中提取的信息替换 NaN 值。
    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(),但对于符号和不同语言更可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-20
      • 2016-09-24
      • 2016-01-17
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多