从产品描述中提取数值数据



我正在使用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

显然前两项是相同的。我希望regex首先在整个描述中查找'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

我的原始数据框架没有盎司,我正试图添加该列并同时提取正确的数据。我应该换个方式吗?

可以使用

>>> 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演示。

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