Python实战:实现Excel多个工作簿合并及多功能数据透视

本文介绍了如何使用Python将多个Excel工作簿合并,并进行数据透视操作。通过Pandas库读取Excel文件,利用concat进行合并,pivot_table进行数据透视,resample和rolling进行时间频率的汇总和变化分析。此外,还探讨了如何根据用户需求自定义时间周期,生成相应的时间频率透视表。
摘要由CSDN通过智能技术生成

Python实现多个工作簿合并及多功能数据透视

大家好,这次项目给大家带来的是Python实现多个Excel工作簿合并,并对合并后的结果集进行数据透视的示例。对于数据透视,Excel当中已经有了比较强大的透视功能,但是缺点是灵活性不足,就是对于时间频率、周期以及计算方式都不够灵活,因此Python正好弥补了这块不足。

首先看下几天的数据集的样子:
图片
这个是要合并的所有的工作簿
图片

这是每个工作簿的样子,每个文件的内部样式都要保持一致能才能进行完整的合并。

接下来简单谈谈我的功能实现:

1. 功能模块介绍:

使用Path模块:

  • 读取指定文件夹下的所有excel文件

使用Pandas

  • read_excel()读取所有工作簿
  • concat()合并多有数据
  • pivot_table() 进行简单数据透视
  • resample()日期重采样进行不同时段的数据汇总
  • rolling() 探查指定固定时间段数据的变化程度
  • to_excel()汇总数据到新的工作簿
2. 扩展:时间选择
  • 按照固定频率:
  • 每几天/周/月:例如:‘7D’
  • 时间频率设置参数如下:
    图片

代码:

导入扩展包

import pandas as pd
from pathlib import Path

数据整合

# 数据整合:
def data_concat():
    # 提示用户输入文件夹路径:
    folder_path = Path(input('请输入要处理文件的文件夹路径:'))
    # 提取所有文件列表:
    file_list = folder_path.glob('*merge.xlsx')
    # 整合所有列表
    df_list = []
    for i in file_list:
        if not i.name.startswith('~$'):
            df = pd.read_excel(i)
            df_list.append(df)
    dfs = pd.concat(df_list,axis=0) # axis=0 代表上下合并,axis=1代表左右合并
    # 提示用户需要提取哪列或者哪几列数据,name和date是必须添加的数据,因此也要进行整合
    col_list = input('请输入要提取的列名,多个列名用空格间隔:').split(' ')
    if ('name' in col_list)&('date' in col_list):
        pass
    elif 'name' in col_list:
        col_list.append('date')
    elif 'date' in col_list:
        col_list.append(['name'])
    else:
        col_list.extend(['name','date'])
    df = dfs[col_list]
    df.set_index('name',inplace=True)
    # 输出数据:
    return df

实现简单数据透视

我使用了pivot_table()函数来生成以股票名为行索引,日期为列索引,不同计算汇总添加新列的方式生成透视结果。我将用户指定的多个计算添加到列表中,然后依次执行,并生成新的列添加到透视结果中,这样就能很简单快速的生成透视结果了

# 实现简单数据透视
def pivot_data(df):
    # 提示用户需要进行汇总的方法:
    method_list = input('请输入要汇总的方法:求和,非重复计数,平均值,最大值,最小值,方差,标准差,多个方法以空格间隔:').split(' ')
    table = pd.pivot_table(df,index='name',columns='date',fill_value=0)
    for i in range(len(method_list)):
        if method_list[i] == '求和':
            table[method_list[i]] = table.sum(1)
        elif method_list[i] == '平均值':
            table[method_list[i]] = table.mean(1)
            print(table
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值