首页 > 解决方案 > Pandas Groupby - 枚举数据框并复制到新的、独特的 Excel 工作表中

问题描述

因此,下面链接图片中的数据位于 Excel 工作簿中的一个工作表上,该工作表是通过使用 Pandas 将一堆 Excel 文件附加在一起创建的(我添加了第一列“Row#”,仅用于说明目的)。

我的数据集的图片: 我正在尝试通过“年份”和“场景”的独特组合进行枚举,并将该数据复制到一个新的工作簿中。此外,在那个新工作簿中,我想要为每个独特组合及其所有数据制作一个独特的工作表。

例如,将创建一个新的 excel 工作簿,该工作簿中的第一个选项卡将标题为“2020 Actuals”,并且该工作表将仅包含上图中的第一行(其中年份 = 2020 和 Scenario = Actuals)。它还将包括上面屏幕截图中的所有标题以及每个新工作表。同一工作簿中的下一个工作表将标题为“2020 计划”,并将包含第 2 至 5 行。第三个工作表将标题为“2020 Fcsst”,仅包含第 6 行和第 7 行(并包含标题)。等等等等。

所以基本上我正在尝试为列年份和场景的每个特定组合/串联创建独特的工作表。我不想以任何方式对“Jan”或“Feb”列中的值进行透视、求和或聚合。只是试图将每个独特的年度情景组合分割成一个新的 Excel 工作表。我知道这可以通过“for循环”和pandas groupby来完成,但不能完全理解。

这是据我所知,但得到这个错误-> TypeError: expected string or bytes-like object

writer = pd.ExcelWriter('test2.xlsx')
grouped = combined.groupby(['Year','Scenario'])

for name, group in grouped:
    group.to_excel(writer, sheet_name=name)
writer.save

标签: pythonexcelpandasfor-looppandas-groupby

解决方案


您不需要 groupby 来执行此操作,只需要过滤数据集。(如果您确实需要 groupby 来获取聚合,请先执行此操作,然后使用以下内容开始)。

您还需要使用安装 xlsxwriterpip install xlsxwriter

一般的想法是找到唯一的分组,并遍历它们过滤数据集并写入每个工作表。

import pandas as pd
import random

# Create randomized dataframe
df = pd.DataFrame({'Year':[random.choice(['2010', '2011', '2012']) for _ in range(100)],
                   'Scenario':[random.choice(['Plan', 'Actuals', 'Fcsst']) for _ in range(100)],
                   'Val':list(range(0, 100))})

# You can sort values here if you want, but you don't have to
df = df.sort_values(['Year', 'Scenario'])
df.head()

    Year Scenario  Val
5   2010  Actuals    5
14  2010  Actuals   14
31  2010  Actuals   31
64  2010  Actuals   64
69  2010  Actuals   69

# Define your list of unique concatenations of Year and Scenario.
unique_ys = df[['Year', 'Scenario']].drop_duplicates().values.tolist()
#or
unique_ys = list(df.groupby(['Year', 'Scenario']).groups)
unique_ys

[('2010', 'Actuals'),
 ('2010', 'Fcsst'),
 ('2010', 'Plan'),
 ('2011', 'Actuals'),
 ('2011', 'Fcsst'),
 ('2011', 'Plan'),
 ('2012', 'Actuals'),
 ('2012', 'Fcsst'),
 ('2012', 'Plan')]

# Initialize a writer object, and determine the filename
writer = pd.ExcelWriter('finance_file.xlsx', engine='xlsxwriter')

# Iterate through unique concatenations, filter the datasets and write them to each sheet.
for list_ in unique_ys:
    df[(df.Year == list_[0]) & (df.Scenario == list_[1])].to_excel(writer, 
                                                                   sheet_name=list_[0]+' '+list_[1], 
                                                                   index=False)

# Close the Pandas Excel writer and output the Excel file.
writer.save()

推荐阅读