【问题标题】:Write Multiple Dynamic DataFrames to Excel Workbook将多个动态数据帧写入 Excel 工作簿
【发布时间】:2019-05-18 00:13:54
【问题描述】:

我正在寻求过滤不同数据框以导出到工作表的帮助。这是一个示例数据框。

import pandas as pd
import numpy as np

np.random.seed(1111)
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B','Group C','Group D'], 10000),
'Sub-Category':np.random.choice( ['X','Y','Z'], 10000),
'Sub-Category-2':np.random.choice( ['G','F','I'], 10000),
'Product':np.random.choice( ['Product 1','Product 2','Product 3'], 10000),
'Units_Sold':np.random.randint(1,100, size=(10000)),
'Dollars_Sold':np.random.randint(100,1000, size=10000),
'Customer':np.random.choice(pd.util.testing.rands_array(10,25,dtype='str'),10000),
'Date':np.random.choice( pd.date_range('1/1/2016','12/31/2018',  
                      freq='D'), 10000)})

以下是我想导出到 Excel 工作簿中的不同数据框:

df1 = df.groupby(['Category','Sub-Category-2','Product']).agg({'Units_Sold':'sum'})
df2 = df.groupby(['Category','Product',pd.Grouper(key='Date',freq='A-APR')]).agg({'Dollars_Sold':'sum'})
df3 = df.groupby(['Category','Product','Sub-Category']).agg({'Units_Sold':'sum','Dollars_Sold':'sum'})

对于每个“类别”,我想创建一个单独的 Excel 工作簿,其中每个数据框都经过过滤,以仅显示特定的“类别”。例如,工作簿“A 组”将 df1、df2 和 df3 作为单独的工作表,其中数据框仅显示“类别”=“A 组”的值。工作簿“B 组”将具有相同的信息,只是在“类别”=“B 组”的位置过滤。

我知道如何使用 .loc 手动执行此操作,但这似乎很慢。我的问题是如何以 pythonic 方式执行此操作?示例数据不大,但我的真实数据在“类别”中有 30 多个类别。有没有办法创建一个函数来适当地切片并在过滤后踢出数据帧?

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    跑步怎么样

    for c in df.Category.unique():
        with pd.ExcelWriter(f"/Users/constantino/Desktop/{c}.xlsx") as writer:
            for i, d in enumerate([df1, df2, df3]):
                d.loc[c].to_excel(writer, sheet_name=f"df{i+1}")
    

    【讨论】:

    • 非常感谢您的快速回复!这可行,但是我宁愿在操作之前不重置索引,因为分组是首选。有关如何使这项工作发挥作用的任何建议?
    • 当然,我已更新答案以反映您的要求。
    • 太好了 - 非常感谢!这很好用而且很简单——我应该明白这一点。非常感激!最后一个请求 - 在 sheet_name 部分,是否可以在枚举中传递数据框列表?我的问题是我的数据框的名称与 df1、df2、df3 等不同。它们可能被命名为 view1、pivot2、test3 等。如果可能的话,我希望工作表名称能够反映实际的数据框名称。再次感谢!
    • 嗨@Constantino - 最后一个问题运气好吗?
    • 这不是直接可能的,请参阅stackoverflow.com/q/18425225/1153897 我不建议这样做,因为您在脚本中选择的变量名在该脚本的上下文之外没有任何意义。相反,请选择一种系统化、有意义的方式来报告您的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2014-12-14
    相关资源
    最近更新 更多