【问题标题】:StyleFrame row_index AttributeError: 'int' object has no attribute 'value'StyleFrame row_index AttributeError:“int”对象没有属性“value”
【发布时间】:2021-03-02 17:59:40
【问题描述】:

我正在尝试以编程方式创建一个电子表格来存储一些 AWS 数据,方法是采用 Excel 模板并向其中添加新数据。我决定为此使用 StyleFrame 来保留格式。我已经设法将数据以我想要的格式连接在一起,但是当我尝试将其写入 Excel 文件时,我一直遇到索引问题。

stacktrace的相关部分是:

File "/Users/jaybailey/PycharmProjects/CostReports/lambdas/build_cost_reports/build_cost_reports.py", line 143, in create_organisation_cost_report
    org_report.to_excel(create_report_name(organisation)).save()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in to_excel
    export_df.index = [row_index.value for row_index in export_df.index]
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in <listcomp>
    export_df.index = [row_index.value for row_index in export_df.index]
AttributeError: 'int' object has no attribute 'value'

我尝试将 dtype 更改为“object”,重置索引,然后手动将其重置。我也尝试过使用调试器,这让我意识到我的错误——我影响的是数据框,而不是样式框。我发现 StyleFrame 上的 row_indexes 属性是一个由整数组成的元组,这使得错误更有意义。我试图手动更改它,但该属性是只读的。

鉴于 row_indexes 属性无法更改,来自 StyleFrame,并且缺少 StyleFrame 本身要求的值,所以我决定在这里询问。这是我正在查看的代码部分。

org_report = styleframe.StyleFrame.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
report_data = pandas.DataFrame(report_data)

# Used to make sure the data concatenates properly.
report_data.columns = org_report.columns


org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
                             org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)

org_report.to_excel(create_report_name(organisation)).save() # Error occurs here.

我了解辅助功能很难完全理解。 create_report_name 只创建一个“YYYY-MM-DD-Organisation_Name_Cost_Report.xlsx”类型的字符串。 report_data 产生以下输出:

                              TOTAL SPEND  ...  Monthly Change
0       Amazon Relational Database Service  ...          -4.38%
1   Amazon Elastic Compute Cloud - Compute  ...          -3.65%
2                              EC2 - Other  ...           1.25%
3                      AWS Premium Support  ...         -100.0%
4                         AmazonCloudWatch  ...          -2.36%
5                         Amazon Detective  ...          -0.45%
6            Amazon Simple Storage Service  ...           6.38%
7                           AWS CloudTrail  ...          -7.46%
8            Amazon Elastic Load Balancing  ...          -6.34%
9                               AWS Lambda  ...           -2.3%
10                                   Other  ...         255.49%

在我尝试将其写入 Excel 文件之前,org_report 看起来像这样,大部分仍填充有虚拟数据。

                               TOTAL SPEND 2 mo.ago Last Month Monthly Change
0               Total Organisational Spend      5.0        6.0            0.2
1                                      nan      nan        nan            nan
2                             AWS SERVICES      nan        nan            nan
3                                    Total      5.0        6.0            0.2
4       Amazon Relational Database Service   196994     188361         -4.38%
5   Amazon Elastic Compute Cloud - Compute   106007     102134         -3.65%
6                              EC2 - Other  72467.6    73373.5          1.25%
7                      AWS Premium Support  40442.2          0        -100.0%
8                         AmazonCloudWatch  32248.8    31488.9         -2.36%
9                         Amazon Detective  20903.7    20809.1         -0.45%
10           Amazon Simple Storage Service  19415.6    20655.3          6.38%
11                          AWS CloudTrail  12135.8      11230         -7.46%
12           Amazon Elastic Load Balancing  10617.6    9944.26         -6.34%
13                              AWS Lambda  8258.99    8069.12          -2.3%
14                                   Other  21762.7    77363.8        255.49%
15                           SUBCATEGORIES      nan        nan            nan
16                               DIRECTORS      nan        nan            nan
17                                   Total      5.0        6.0            0.2
18                                     nan      nan        nan            nan
19                         SHARED PRODUCTS      nan        nan            nan
20                                   Total      5.0        6.0            0.2
21                                     nan      nan        nan            nan
22                       Subcategory Total      5.0        6.0            0.2
23               Subcategory Cost Coverage      1.0        1.0            0.0

任何建议将不胜感激!

【问题讨论】:

    标签: python python-3.x pandas xlsx styleframe


    【解决方案1】:

    问题主要出在这一行:

    org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
                                 org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)
    

    这会破坏底层的.data_df,因为pd.concat.reset_index 返回一个标准DataFrame,而StyleFrame 预计每个“单元格”将包含一个包装器Container 对象(该对象缺少来自错误的.value 属性)。

    最佳做法是尽可能多地在 pandas 级别处理数据,并且仅在您准备好开始设置样式和导出时才创建 StyleFrame 对象。

    org_report = pd.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
    report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
    report_data = pandas.DataFrame(report_data)
    
    # Used to make sure the data concatenates properly.
    report_data.columns = org_report.columns
    
    org_report= concat([org_report.iloc[:4], report_data,
                        org_report.iloc[5:]], axis=0).reset_index(drop=True)
    
    sf = styleframe.StyleFrame(org_report) 
    sf.to_excel(create_report_name(organisation)).save()
    

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2021-11-30
      • 2020-03-26
      • 2013-04-15
      • 2021-01-18
      • 2019-05-30
      • 2021-02-24
      • 2021-08-01
      • 2015-07-06
      相关资源
      最近更新 更多