背景:得到賬單數據,需要對其進行處理,針對其中一個列進行字符拆分並生成新列:

需要在 列 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篩選
# [ i for i in re.split(r'¥-*\d+\.\d+|\n',fee) if len(i) != 0] 等同上面寫法,map以及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')
