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