我正在使用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
返回元组列表)转换为字符串(因为其中一个组的值总是空的)。