背景:得到账单数据,需要对其进行处理,针对其中一个列进行字符拆分并生成新列:
需要在 列 L、M、N...对费用明细这一列拆分:如下图所示
思路如下
第一步:对费用明细这一列 先取出字符,然后用正则取出 费用明目,即我们要创建新列的 columns;
第二步:因为最后生成的dateframe ,字典是可以生成dateframe,所以拿到第一步的 {费用明目:费用} 以后 字典。对于全 费用明细 ,部分行为缺失项,需要填充为0,完整代码中会有技术细节描述;
第三步:第二步生成的dateframe 最后如何与原始的账单 进行结合在一起?刚开始思路是:循环操作:针对每一行 每一列逐个单元格 进行赋值;第二种思路是:将第二步生成的dateframe一起合并新的dateframe 然后与原始账单进行连接 concat操作;
总结:第三步最后采用 第二种思路,大批量的赋值操作效率低。
import pandas as pd
import re
from functools import reduce
data = pd.read_excel('/Users/xujingfei/Library/Containers/com.microsoft.Excel/Data/Downloads/zuixin/fee.xlsx')
i = 0
title = ['起步价','超里程价','企业保险','随车人身意外保险','搬运费','停车费','高速路桥费','小费','额外搬运费','逾时等候费','拉拉券','等候费','规格','搬运费税费']
dict_fyi = {k:0.00 for k in title}
list_df = []
for i,j in zip(data.index,[4]*1536):
fee = data.iloc[i,j]
key = list(filter(None,re.split(r'¥-*\d+\.\d+|\n',fee))) #用数字split会产生空字符串,使用filter筛选
value = re.findall(r'-*\d+\.\d+',fee)
dict_fee = dict(zip(key,value))
df = dict(dict_fyi,**dict_fee) # 进行字典合并,相同key ,第二个会覆盖掉第一个的value
df_t = pd.DataFrame(df,index=[i])
list_df.append(df_t) # 将每一行生成的字典 ,放入字典中
df_end = reduce(lambda x,y:pd.concat([x,y],axis=0),list_df) # 解决方案:使用reduce进行迭代拼接,就不存在temp dataframe的存在了。
k = pd.concat([data,df_end],axis=1) #第三步思路,汇总所有的dateframe 与原始dateframe 连接
k.to_excel('22.xlsx')