zoukankan      html  css  js  c++  java
  • 处理 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')
    
  • 相关阅读:
    JDBC操作MySQL
    MySQL-SQL语句
    MySQL-环境安装、配置、卸载、系统介绍
    JavaSE-单元测试、反射、注解
    JavaSE-Stream、方法引用
    JavaSE-函数式编程接口
    JavaSE-网络编程
    Document
    Document
    Document
  • 原文地址:https://www.cnblogs.com/ivan09/p/15707944.html
Copyright © 2011-2022 走看看