【问题标题】:Extract numerical data from product description从产品描述中提取数字数据
【发布时间】:2021-05-29 06:46:54
【问题描述】:

我正在使用 python3。

我正在尝试从产品描述中提取数字数据。然而,有时同一产品有不同的描述,这会导致结果相互矛盾。

我的代码是:

import pandas as pd
import re
data = {'desc':['1 oz Silver Eagles Monster Box  (500 pc)', 'Silver Eagle Monster Box (500 pcs 1 oz coins)', '2021 10 oz Silver Royal Canadian Mint Bar'], 'inventory':['in stock', 'in stock', 'out of stock']}
df=pd.DataFrame(data)
df['ounces']=df['desc'].str.extract(r'(\d+ pc|\d+ oz)')
print(df)

我得到的是:

                                            desc     inventory  ounces
0       1 oz Silver Eagles Monster Box  (500 pc)      in stock    1 oz
1  Silver Eagle Monster Box (500 pcs 1 oz coins)      in stock  500 pc
2      2021 10 oz Silver Royal Canadian Mint Bar  out of stock   10 oz

显然前 2 项是相同的。我希望正则表达式首先在整个描述中查找“pc”,然后如果没有找到,则查找“oz”,但这不是它的作用。我需要得到的是:

                                            desc     inventory  ounces
0       1 oz Silver Eagles Monster Box  (500 pc)      in stock  500 pc
1  Silver Eagle Monster Box (500 pcs 1 oz coins)      in stock  500 pc
2      2021 10 oz Silver Royal Canadian Mint Bar  out of stock   10 oz

我的原始数据框没有盎司,我正在尝试添加该列并同时提取正确的数据。我应该以不同的方式解决这个问题吗?

【问题讨论】:

    标签: python-3.x regex pandas


    【解决方案1】:

    你可以使用

    >>> df['ounces'] = df['desc'].str.findall(r'(?:.*\D)?(\d+ pc)|(\d+ oz)').str[0].str.join('')
    >>> df
                                                desc     inventory  ounces
    0       1 oz Silver Eagles Monster Box  (500 pc)      in stock  500 pc
    1  Silver Eagle Monster Box (500 pcs 1 oz coins)      in stock  500 pc
    2      2021 10 oz Silver Royal Canadian Mint Bar  out of stock   10 oz
    

    (?:.*\D)?(\d+ pc)|(\d+ oz) 模式将优先考虑匹配pc 的第一个捕获组,而oz 部分仅在出现在pc 之后才会匹配。

    请参阅regex demo

    由于Series.str.findall返回所有模式匹配,.str[0]只需要获取第一个结果,.str.join('')将元组(因为模式中有两个组,findall返回元组列表)转换为一个字符串(因为其中一个组值将始终为空)。

    【讨论】:

    • 谢谢。如果有超过 2 种可能的东西,可以扩展模式还是必须是一个元组?
    • @Jamie 可以展开的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2021-06-22
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多