用pandas批量分组处理excel数据

用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 
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值