用pandas批量分组处理excel数据

本文介绍了使用Python的pandas库批量处理Excel文件,包括按字段分组计算和值,对比SQL的便利性,学习了pandas的groupby、concat、pivot_table方法以及内存优化。在处理过程中遇到文件损坏问题,通过设置ExcelWriter的engine参数和异常处理来避免。此外,探讨了matplotlib和pyecharts绘图,以及DataFrame的内存管理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用pandas批量分组处理excel数据

需求比较简单,按照指定字段分组,计算指定字段的和或均值。
用SQL处理的话就一个groupby,可是没有数据库环境,只好用python(比起SQL真的是一点也不方便)处理excel文件。
学习了:

  1. 批量读取一个文件夹下所有excel文件,读、追加写入excel文件。
  2. 用pandas的groupby方法,还是比不上SQL,只找到了在分组时加过滤条件的方法,没有找到在计算时加过滤条件的方法,这样的话就跟用pivot_table没什么区别,还更复杂费代码,在生成多级列名时也麻烦些。
  3. 学习了pandas.concat里生成多级表头(或者行名、列名)的方法。
  4. 用pandas的透视表pivot_table方法,处理一般需求都够用,代码量少。
  5. 用matplotlib.pylot画图,画出的图也是动态的,但是一保存就成静态的了。
  6. 用pyecharts画图,画出的图像股票K线图一样好用,可以保存成html的动态的图。
  7. 尝试了网友的减少DataFrame占用的内存的方法,有效,但是未解决python.exe占用太多内存的原因。
  8. 学习了DataFrame里过滤数据,增加新列,补齐填充数据的方法。
  9. 学习了用apply, lambda处理DataFrame里时间字段date转str的方法。
  10. 使用了接受ctl+c跳出循环的方法
  11. 尝试了modin.pandas,的确可以起多个线程充分利用多核CPU进行计算,但是遇到处理不了的错误,还是放弃使用了。

python代码

#import modin.pandas as pd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts.charts import Line
from pyecharts import options as opt
import os
import time

col_year = 'V04001'
col_month = 'V04002'
col_day = 'V04003'
col_hour = 'V04004'

calcColumn1 = 'V13019'
calcColumn2 = 'V12001'

filesDir = input("请输入要分组计算的excel文件所在的路径(如e:\\data1):") 
if filesDir == '':
    filesDir=r'E:\data1'
pilotPic = input("是否要画matpilot图,是输入1,否输入0:")
if pilotPic == '':
    pilotPic=0
echartPic = input("是否要画echart图,是输入1,否输入0:")
if echartPic == '':
    echartPic=0

NAlist = []
#网友的减少DataFrame占用的内存的方法,props是properties,代表DF
def reduce_mem_usage(props):
    # 计算当前内存
    start_mem_usg = props.memory_usage().sum() / 1024 ** 2
    print("Memory usage of the dataframe is :", start_mem_usg, "MB")
    
    # 哪些列包含空值,空值用-999填充。why:因为np.nan当做float处理
    NAlist = []
    for col in props.columns:
        # 这里只过滤了objectd格式,如果你的代码中还包含其他类型,请一并过滤
        if (props[col].dtypes != object):  # Exclude strings
            
            print("**************************")
            print("columns: ", col)
            print("dtype before", props[col].dtype)
            
            # 判断是否是int类型
            isInt = False
            mmax = props[col].max()
            mmin = props[col].min()
            
            # Integer does not support NA, therefore Na needs to be filled
            if not np.isfinite(props[col]).all():
                NAlist.append(col)
                props[col].fillna(0, inplace=True) # 用0填充
                
            # test if column can be converted to an integer
            asint = props[col].fillna(0).astype(np.int64)
            result = np.fabs(props[col] - asint)
            result = result.sum()
            if result < 0.01: # 绝对误差和小于0.01认为可以转换的,要根据task修改
                isInt = True
            
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值