Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas Groupby-通过Dataframe枚举并复制到新的、唯一的Excel工作表中_Python_Excel_Pandas_For Loop_Pandas Groupby - Fatal编程技术网

Python Pandas Groupby-通过Dataframe枚举并复制到新的、唯一的Excel工作表中

Python Pandas Groupby-通过Dataframe枚举并复制到新的、唯一的Excel工作表中,python,excel,pandas,for-loop,pandas-groupby,Python,Excel,Pandas,For Loop,Pandas Groupby,因此,下面链接图片中的数据位于Excel工作簿的一张纸上,该工作簿是通过使用Pandas将一组Excel文件附加在一起创建的(我添加了第一列“Row#”,仅用于说明目的) 我想做的是列举“年”和“情景”的独特组合,并将这些数据复制到新工作簿中。此外,在新工作簿中,我希望为每个唯一的组合及其所有数据制作一个唯一的工作表 例如,将创建一个新的excel工作簿,该工作簿中的第一个选项卡标题为“2020实际值”,该工作表将仅包含上图中的第一行(其中年份=2020,场景=实际值)。它还将包括上述屏幕截图

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

我想做的是列举“年”和“情景”的独特组合,并将这些数据复制到新工作簿中。此外,在新工作簿中,我希望为每个唯一的组合及其所有数据制作一个唯一的工作表

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

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

这是我得到的,但得到以下错误-->类型错误:预期的字符串或类似字节的对象

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

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

要做到这一点,您不需要分组,只需要过滤数据集。(如果您确实需要groupby来获取聚合,请先执行此操作,然后再开始执行以下操作)

您还需要使用
pip安装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()

非常感谢你。一个小小的改变,它就完美地工作了。我不得不将str添加到列表中:`` to_excel(writer,sheet_name=(str(list[0]))+''+list[1],index=False)``一位同事最后也向我展示了一种使用groupby的方法:“writer=pd.ExcelWriter('test4.xlsx',engine='xlsxwriter'))对于yearscenario,df_chunk in combined.groupby(['Year','Scenario']):df_chunk.to_excel(writer,sheet_name=str(yearscenario[0])+“”+str(yearscenario[1]),index=False)writer.save()writer.close()`