首页 > 编程问答 >使用 Python 总结 excel 工作簿

使用 Python 总结 excel 工作簿

时间:2024-05-30 09:24:34浏览次数:29  
标签:python excel openpyxl summary

我有一个 excel 工作簿,其中有许多选项卡。每个选项卡都有合并单元格。这是我需要做的,也是我目前所掌握的: 1- 遍历工作表 2- 读取工作表数据 3- 取消合并单元格,将第一个值复制到下面未合并的空单元格中 4- 按列组合分组,并求和某些列的值 5- 输出最下面几行的值,这些值是上面几行值的总和 5- 保持相同的数据结构 6- 输出一个新工作簿,其中包含多张生成数据的工作表

下面是一个工作表的输入数据示例:

在此数据中,"总计"列中每行的值 = Jan+Feb+Mar+Apr+May+Jun 中的值 输入数据

我需要的输出是这样的:期望输出

每个月份是组合 (BU+Category+Name+Act+CM+M) 中月份值的总和。 例如,SP+SS 的第一个组合为 1 月 = 5 + -

BV 应进行计算。

BV 应单独求和,就好像它们是另一个 M。

这是我目前尝试过的:

## 取消合并列和行

wb = load_workbook(filename)
sheet = wb[sheet1]
unmerged_path = "Unmerged\unmerged_br1.xlsx";

## 取消合并单元格并赋予顶层第一个值
merge_list = []
for merge in sheet.merged_cells.ranges:
    merge_list.append(merge)

for group in merge_list:
    print("Changing merged cells " + str(group.coord))
    min_col, min_row, max_col, max_row = range_boundaries(group.coord)
    top_left_cell_value = sheet.cell(row=min_row, column=min_col).value
    sheet.unmerge_cells(str(group))
    for row in sheet.iter_rows(min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row):
        for cell in row:
            cell.value = top_left_cell_value

if not os.path.exists('Unmerged'):
   os.makedirs('Unmerged')

wb.save(unmerged_path)

这将为我在中间工作簿中保存未合并文件,我将再次读取该工作簿以输出摘要文件,如下所示:

unmerged = pd.read_excel(unmerged_path, sheet_name=sheet)

final = unmerged.groupby(['BU','Category', 'Name', 'Act', 'CM', 'M'], as_index=False).agg({'Jan':'sum','Feb':'sum'、
                      三月':'总和', 四月':'总和', 五月':'总和', 六月':'总和'})

## 每个 BU、Category、Name、Act、CM、M 的总计列(1 月至 6 月的数值总和
final['Total'] = final[final.columns[6:]].sum(axis=1)

final.to_excel("Output\file.xlsx", sheet_name = Name1, index=False)

我使用上述代码得到的输出并没有返回 PP 和 Time 列。此外,它也没有输出我需要的底部列

PP 列是 Med1 的 SP/SS。时间列应该是 6,也就是 SP 的值。 另一个例子是,Med4 的 PP 列为 Soc,时间列变成 N/A。


了解了!正在尝试通过取消合并单元格、执行一些计算并在保留特定数据结构的同时创建汇总报告来转换 Excel 数据。我将帮助解决这个问题。

以下是基于提供的代码和解释的分步 Python 解决方案,其中考虑了“PP”和“Time”列,以及所需的其他计算:

import pandas as pd
import openpyxl

# 读取数据
unmerged_path = "Unmerged\unmerged_br1.xlsx"
unmerged = pd.read_excel(unmerged_path, sheet_name='Sheet1')  # 将“Sheet1”替换为实际的sheet名称

# ----- 步骤 1:准备数据 -----
# 1. 填充 PP 和 Time 列
# 假设“PP”列依赖于“Category”列,而“Time”列依赖于“Act”列
unmerged['PP'] = unmerged['Category'].apply(lambda x: 'SP/SS' if x == 'Med1' else ('Soc' if x == 'Med4' else ''))
unmerged['Time'] = unmerged['Act'].apply(lambda x: 6 if x == 'SP' else ('N/A' if x == 'N/A' else ''))

# 2. 将月份列转换为数字(如果尚未转换)
month_cols = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
unmerged[month_cols] = unmerged[month_cols].apply(pd.to_numeric, errors='coerce')

# ----- 步骤 2:执行计算 -----

def calculate_aggregations(df):
    """对 DataFrame 的每个组执行计算。"""
    df['Total'] = df[month_cols].sum(axis=1)
    return df

final = unmerged.groupby(['BU', 'Category', 'Name', 'PP', 'Act', 'Time', 'CM', 'M'], as_index=False).apply(calculate_aggregations)

# ----- 步骤 3:创建汇总行 -----

def create_summary_rows(df):
    """创建每个组的汇总行。"""
    # 1. 计算“总计”行
    total_row = df[month_cols + ['Total']].sum().to_frame().transpose()
    total_row['BU'] = df['BU'].iloc[0]
    total_row['Category'] = df['Category'].iloc[0]
    total_row['Name'] = df['Name'].iloc[0]
    total_row['PP'] = df['PP'].iloc[0]
    total_row['Act'] = 'Total'
    total_row['Time'] = ''
    total_row['CM'] = df['CM'].iloc[0]
    total_row['M'] = df['M'].iloc[0]

    # 2. 计算“BV 总计”行
    bv_total_row = df[df['M'] == 'BV'][month_cols + ['Total']].sum().to_frame().transpose()
    bv_total_row['BU'] = df['BU'].iloc[0]
    bv_total_row['Category'] = df['Category'].iloc[0]
    bv_total_row['Name'] = df['Name'].iloc[0]
    bv_total_row['PP'] = df['PP'].iloc[0]
    bv_total_row['Act'] = 'BV Total'
    bv_total_row['Time'] = ''
    bv_total_row['CM'] = df['CM'].iloc[0]
    bv_total_row['M'] = 'BV'

    # 将汇总行附加到 DataFrame
    return pd.concat([df, total_row, bv_total_row], ignore_index=True)

final = final.groupby(['BU', 'Category', 'Name', 'PP'], as_index=False).apply(create_summary_rows).reset_index(drop=True)

# ----- 步骤 4:输出到 Excel -----
final.to_excel("Output\file.xlsx", sheet_name='Sheet1', index=False)  # 将“Sheet1”替换为实际的sheet名称

代码说明:

  1. 数据准备:

    • 填充“PP”和“Time”: 代码使用 .apply 和 lambda 函数根据提供的逻辑填充这些列。
    • 将月份转换为数字: 确保月份列包含数字以进行求和。
  2. 执行计算:

    • calculate_aggregations 函数:此函数现在计算每月总计(“总计”列)。
  3. 创建汇总行:
    • create_summary_rows 函数:此函数为每个组计算两行:
      • “总计”行:对所有“Act”值求和。
      • “BV 总计”行:仅对“M”列中的“BV”值求和。
  4. 输出到 Excel:将结果保存到新的 Excel 文件。

请注意:

  • 用输入和输出文件的实际文件名替换占位符文件名。
  • 根据的数据集调整“PP”和“Time”列的逻辑。

此代码应生成一个 Excel 文件,其中包含在所需格式中描述的聚合数据,包括“PP”、“Time”、“Total”、“Total Total”和“BV Total”行。如有任何其他问题,请告诉我!

标签:python,excel,openpyxl,summary
From: 78552496

相关文章

  • 《python编程从入门到实践》day42
    #昨日知识点回顾        使用Bootstrap设置项目“学习笔记”的样式#今日知识点学习    20.1.3修改base.html        1.定义HTML头部#base.html{%loadbootstrap4%}<!doctypehtml><htmllang="en"><head> <metacharset="utf......
  • Python-使用OpenCV(二)_第一个示例程序
    1、创建项目2、创建代码importcv2#加载图片image=cv2.imread("C:\\Users\\Administrator\\Pictures\\Screenshots\\20240311220733.png")#显示图片cv2.imshow("Image",image)#等待任意键被敲击cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()3、结......
  • Unleashing Robotics: Mastering Quaternion Kinematics with Python - Chapter7(原创
    UnleashingRobotics:MasteringQuaternionKinematicswithPython-Chapter7(原创系列教程)本系列教程禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱[email protected].使用截断级数的近似方法在状态估计问题中,我们通常使用一个称为状态转移矩阵......
  • 【python007】读取csv文件url多进程下载图片数据(最近更新中)
    1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!3.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!4.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!......
  • spark sql导出数据为excel文件和csv文件
    一、利用to_csv函数导出数据为csv文件:df=spark.sql('''select*fromtable;''')df.toPandas().to_csv('table.csv',index=False)其中:index=False参数表示在保存时不包括行索引。二、利用to_excel函数导出数据为excel文件:df=spark.sql('''select*from......
  • python基础 - 异常与日志
    异常----异常1:try:print(1/0)#try里放的是被检测的语句块exceptZeroDivisionErrorase:#处理异常的语句块print('除数不能为0')#自定义的异常print(e)#系统自带的异常----异常2:try:num=int(input('请输入一个数:‘))print(1/num)exceptZeroDivisionError:print(‘除数不能......
  • Excel中怎样将第一行建立好的规则套用到每一行?
    考虑使用条件格式来完成,有两种方式可以尝试:一、一次性创建条件格式1.选中需要设置条件格式的区域,如果是不连续的区域,可以按住Ctrl键,然后用鼠标依次选中需要的数据区域2.点击开始选项卡,条件格式,在下拉选项中,点一下新建规则,3.在弹出的对话框中选中使用公式确定要设置格......
  • Excel某列中有不连续的数据,怎么提取数据到新的列?
    这里演示使用高级筛选的例子:1.设置筛选条件在D2单元格输入公式:=COUNTA(A4)>0这里有两个注意事项:*.公式是设置在D2单元格,D1单元格保持为空,**.为什么公式中选A4单元格,A列的第一个数据在A3单元格,我们将这个单元格视为A列数据的列标题,COUNTA函数的的引用单元格为列标题下......
  • excel表格里怎样不删除0,又不显示0呢?
    在单元格里不显示0,大体上有这么几种方法:1.设置单元格自定义格式选中数据区域,鼠标右键,点一下设置单元格格式,选中数字,自定义,在右侧的类型栏,设置格式:[=0]"";G/通用格式这样设置,如果单元格内数据在不是0的情况下需要改成其它格式,则要重新按上述步骤设置。2.修改excel设置......
  • python基础 - 模块与包
    模块与包import包名.模块名importdemo.demo#前缀比较长,一般推荐from包名import模块名demo.demo.fun1(2)fromdemoimportdemodemo.fun1(3)fromdemo.demoimportfun1fun1(4)标准路径标准路径>当前路径>项目路径>其他标准路径importsysforoneinsy.path:pr......