广州-李明 2025-02-20 17:58 采纳率: 57.1%
浏览 9

pandas openpyxl

问题:一个df进行分组一个中等大小的df1, 之后再对df1进行二次分组, 二次分组的每个df保存到ws工作簿的不同sheet中,然后对每个sheet的数字格式进行处理,现在问题是:只有第一个sheet的数字变成百分制了,第二个sheet到组后的sheet都是没有完成数字变成百分制了,请帮我看下问题出在哪里,如何修改。
补充:以下为代码

df=pd.read_excel(path)
FH = 0 
grouped=df.groupby('Cam')  # 根据列'Cam'的值进行分组
for name, group in grouped:  # 对分组内容进行解压,得到组名和小组数据

  # 保存原始表和结果表
  path_save = r"C:\Users\dayin\Desktop\K\KSPLIT.xlsx"
  new_path = path_save.split('.')[0] + '_' + name  + '.' + path.split('.')[1]  # 路径工作簿名称随着这name名称而变化

  wb = openpyxl.Workbook()  # 创建一个工作簿

  grouped_result = group.groupby('Entity')
  for name_1, group_1 in grouped_result:
      group_1=group_1.reset_index(drop=True)  #重置索引不改变原有数据列名

      ws= wb.create_sheet(name_1)

      for r in dataframe_to_rows(group_1, index=False, header=True):
        ws.append(r)
      # sheet1原始数据应用格式

      # 定义样式
      percent_style = NamedStyle(name="percent_style", number_format="0.00%")  # 百分比格式处理
      float_style = NamedStyle(name="decimal_style", number_format="0.00")  # 2位小数格式处理

      for row in ws.iter_rows(min_row=2, min_col=2):  # 数据区域,从第二行开始格式处理
          for cell in row:
              if cell.column in [18, 23, 24]:  # 限定百分比格式的列,数字1表示第1列
                  cell.style = percent_style
              # elif cell.column in [100]:  # 限定2位小数的列,数字5表示第5列
              #     cell.style = float_style

  # 保存文件
  sheet_names = wb.sheetnames
  del wb[sheet_names[0]]
  wb.save(new_path)  # 保存动作

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-02-20 17:58
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    你使用 pandas 和 openpyxl 两个库来处理数据和生成 Excel 文件。问题是,你想对一个 DataFrame 进行分组,得到一个中等大小的 DataFrame,然后对这个 DataFrame 进行二次分组,并将每个分组保存到不同的 Excel sheet 中。最后,你想对每个 sheet 中的数字格式进行处理。

    下面是一个可能的解决方案:

    import pandas as pd
    from openpyxl import Workbook
    
    # 假设 df 是你要处理的 DataFrame
    df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
    
    # 对 df 进行第一次分组
    grouped_df = df.groupby('A')
    
    # 创建一个 Excel 文件
    wb = Workbook()
    ws = wb.active
    
    # 对每个分组进行二次分组
    for name, group in grouped_df:
        # 对 group 进行第二次分组
        sub_grouped_df = group.groupby('B')
        for sub_name, sub_group in sub_grouped_df:
            # 保存到不同的 sheet 中
            ws = wb.create_sheet(sub_name)
            sub_group.to_excel(ws, index=False)
            # 对数字格式进行处理
            for row in ws.iter_rows(values_only=True):
                for cell in row:
                    if isinstance(cell, (int, float)):
                        ws.cell(row=row[0], column=row.index(cell)+1).number_format = '0.00'
    
    # 保存 Excel 文件
    wb.save('output.xlsx')
    

    这个解决方案假设你已经有了一个 DataFrame df,然后对它进行第一次分组,得到一个中等大小的 DataFrame grouped_df。然后,对每个分组进行第二次分组,得到一个新的 DataFrame sub_grouped_df。最后,对每个分组保存到不同的 Excel sheet 中,并对数字格式进行处理。

    请注意,这只是一个可能的解决方案,你可能需要根据你的实际情况进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日