python - 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
解决方案
您不需要 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()
推荐阅读
- angular - 使用异步管道的可观察字符串数组不更新 nouislider.on 事件中的视图
- react-native - MaterialTopNavigator 中的 ScrollView 或 FlatList:拉动刷新在某些 iOS 设备上不起作用(X、X Max、8 Plus)
- scala - Scala 将迭代方法转换为 Iterator 的函数方法
- matlab - Matlab:对二维矩阵进行排序并保留三角形组中的节点
- html - R:对齐 DT 表中的嵌套标题
- postgresql - 如何使用具有排除约束的 ON CONFLICT?
- documentation - 如何获取 pyomo 函数、方法等的信息/帮助
- c# - 验证 Membership.GeneratePassword
- javascript - 有没有更有效的方法来使用 javascript 控制 css 元素
- android - 位图在相机意图中总是返回 null