需求
在进行数据分析的时候,有时候会碰到需要从文本字符串中提取需要的数据来进行分析的情况,这种需求在网络爬虫数据分析非常常见。
比如,需要下列表格“基础薪资规则”字段中提取阶梯单量和价格。而且表格中,大部分规则是4档单量和价格,也有部分是3档规则和价格。
格式为:
第1档单量 | 第2档单量 | 第3档单量 | 第4档单量 | 第1档价格 | 第2档价格 | 第3档价格 | 第4档价格 |
200 | 250 | 300 | 9999 | 3.8 | 4.8 | 5.0 | 5.2 |
200 | 250 | 300 | 9999 | 3.8 | 4.8 | 5.0 | 5.2 |
方法
使用Python中档re模块, 能够从一串有规律文本字符串中提取所需要档数据,配合正则表达式,功能非常强大。
# 提取特征数字,由于存在多个数字,findall()会返回一个列表
# 数据的pattern特征,注意到[0,200)单中需要提取数字200,前面是一个逗号,后面是一个括号+单,提取的内容放在()里,200后的括号,要识别“)”需要用到转义符号\
def find_orderNum(x):
patt = ',(.*?)\)单'
pattern = re.compile(patt)
return pattern.findall(x)
df['档位单量'] = df['基础薪资规则'].apply(find_orderNum)
# 现有档位数
def find_step_num(x):
return len(x)
df['现档位数'] = df['档位价格'].apply(find_step_num)
# 拆分阶梯单量
def find_orderNum1(x):
return eval(x[0])
def find_orderNum2(x):
return eval(x[1])
def find_orderNum3(x):
return eval(x[2])
def find_orderNum4(x):
if len(x)>3:
return eval(x[3])
else:
return eval(x[2])
df['现一档单量'] = df['档位单量'].apply(find_orderNum1)
df['现二档单量'] = df['档位单量'].apply(find_orderNum2)
df['现三档单量'] = df['档位单量'].apply(find_orderNum3)
df['现四档单量'] = df['档位单量'].apply(find_orderNum4)
结果如下: