需求:提取散装商品斤重统计表格中describe列中高值、高高值、中值的斤重
describe列样例如下,高值、高高值、中值分别对应不同的价格分类,我们需要提取不同价格的斤重,以计算总的销售额。如果只是几行这样的记录,直接人工提取就很方便了。样例中可以看出高值3斤,高高值2斤,中值1斤。但是如果有很多这样的行记录,人工取值在这里显然是行不通了,这里考虑使用正则表达式模糊匹配后来提取数值。这里需要提醒的一项是,每行记录不一定三种值的斤重都存在,有可能仅存1种或者2种值的斤重,但不同价格分类只会对应一个斤重。
“内容项1名称:【必填项】高值(abrand/bbrand/cbrand) 内容项1形式:照片
内容项1照片:https//somewebsite.com.cn/public/uploads/task_info/0371e9c843d57d6a84f05975262c34f6.jpg,https//somewebsite.com.cn/public/uploads/task_info/6ec4cf6131b8874c6e1f87ca8092f8a8.jpg
内容项1输入内容:填写斤数:3 斤 内容项2名称:高高值(dbrand) 内容项2形式:照片
内容项2照片:https//somewebsite.com.cn/public/uploads/task_info/090e12e563ffe3a5c8828f3293bae1d1.jpg,https//somewebsite.com.cn/public/uploads/task_info/da3e7a3ba49b00deec91e02db4cb3ad7.jpg
内容项2输入内容:填写斤数:2 斤 内容项3名称:中值(ebrand) 内容项3形式:照片
内容项3照片:https//somewebsite.com.cn/public/uploads/task_info/7c89b720d7949602be71d6d9f2712d61.jpg,https//somewebsite.com.cn/public/uploads/task_info/815430fa71db8dc0cb4b5407e02128d3.jpg
内容项3输入内容:填写斤数:1 斤”
第一步:
我们先观察下数据,发现高值、高高值、中值后边都有一个括号,里边标示了不同值对应的品牌名称,这里我们使用值类型+品牌名称来作为不同价值的商品分类其实更精确,因为高值和高高值这两个描述的后两位都叫“高值",在模糊处理的时候很容易混淆。然后发现斤重数值在“填写斤数:”和”斤”这两个文本之间。
第二步:先将高值、高高值、中值的文字信息分别提取出来
import pandas as pd
import numpy as np
import re
file_path=r"E:\散装商品斤重统计.csv"
data=pd.read_csv(file_path)
pattern_1=re.compile(r"高值(abrand/bbrand/cbrand).*填写斤数.*?斤")#高值 非贪婪匹配正则表达式
pattern_2=re.compile(r"高高值(dbrand).*填写斤数.*?斤")#高高值 非贪婪匹配正则表达式
pattern_3=re.compile(r"中值(ebrand).*填写斤数.*?斤")#中值 非贪婪匹配正则表达式
def split_func_1(x):
if pattern_1.search(x):
return(pattern_1.findall(x)[0])
def split_func_2(x):
if pattern_2.search(x):
return(pattern_2.findall(x)[0])
def split_func_3(x):
if pattern_3.search(x):
return(pattern_3.findall(x)[0])
data["高值"]=data["describe"].apply(split_func_1)
data["高高值"]=data["describe"].apply(split_func_2)
data["中值"]=data["describe"].apply(split_func_3)
这样我们就分别将高值、高高值、中值的文本信息分别提取到不同的列中了,如果所在行的describe列中没有高值记录,那么该行的“高值”列也会为None。注意这里的正则标识式我们使用了非贪婪匹配,即在正则标识式使用了 ?字符,即匹配满足条件最短的字符串。关于非贪婪匹配,可以参考Python正则表达式之初识正则表达式的最后的部分。
第三步:分别提取高值列、高高值列、中值列中的斤重信息
pattern=re.compile(r"(?<=填写斤数:)[0-9.]+")#提取“填写斤数:”字符后边的数值(或者这里描绘成数字和小数点会更为准确)信息,即斤重信息。
def extract_func(x):
if pattern.search(x):
return(pattern.findall(x)[0])
#将高值、高高值、中值列的字符类型转为str,因为如果不转为string类型的话,在该列就无法使用str的函数
data["高值"]=data["高值"].astype(str)
data["高高值"]=data["高高值"].astype(str)
data["中值"]=data["中值"].astype(str)
#提取斤重数值并将其转为float类型
data["高值斤重"]=data["高值"].apply(extract_func).astype(np.float)
data["高高值斤重"]=data["高高值"].apply(extract_func).astype(np.float)
data["中值斤重"]=data["中值"].apply(extract_func).astype(np.float)
通过上述操作我们就分别提取到了每行的高值斤重、高高值斤重、中值斤重。
高值斤重列求和X高值每斤价格+高高值斤重列求和X高值每斤价格+中值斤重列求和X中值每斤价格,这样我们就算得了散装商品总的销售额了。