处理 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')

__EOF__

本文作者ivan09
本文链接https://www.cnblogs.com/ivan09/p/15707944.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   烦恼1234  阅读(667)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示