處理 pandas數據中 批量創建多列並寫入excel的 case


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

需要在 列 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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM