You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效迭代指定属性从Report对象构建Pandas DataFrame?

问题描述

尝试通过以下代码构建Pandas DataFrame:

df = pd.DataFrame(columns=['Year','Revenue','Gross Profit','Operating Profit','Net Profit']) 
rep_vals =['year','net_sales','gross_income','operating_income','profit_to_equity_holders']

for i in range (len(yearly_reports)): 
    df.loc[i] = [yearly_reports[i].x for x in rep_vals] 

运行时报错:'Report' object has no attribute 'x'

以下"暴力写法"可正常运行:

for i in range (len(yearly_reports)): 
    df.loc[i] = [yearly_reports[i].year,yearly_reports[i].net_sales ,
                 yearly_reports[i].gross_income, yearly_reports[i].operating_income, 
                 yearly_reports[i].profit_to_equity_holders]

需求:需要添加更多列,且无需获取yearly_reports的全部属性,如何更高效地迭代所需属性取值?

解决方案
  • 使用getattr()动态获取属性:
    报错本质是直接写.x时,Python会将x视为固定属性名而非变量。用getattr()可根据变量名动态提取属性值,同时用enumerate简化循环:

    df = pd.DataFrame(columns=['Year','Revenue','Gross Profit','Operating Profit','Net Profit']) 
    rep_vals =['year','net_sales','gross_income','operating_income','profit_to_equity_holders']
    
    for i, report in enumerate(yearly_reports):
        df.loc[i] = [getattr(report, attr) for attr in rep_vals]
    
  • 批量构造数据(推荐,性能更优):
    循环使用df.loc[i]赋值效率较低,尤其数据量大时。可先批量生成所有行的数据列表,再直接构造DataFrame:

    rep_vals =['year','net_sales','gross_income','operating_income','profit_to_equity_holders']
    columns = ['Year','Revenue','Gross Profit','Operating Profit','Net Profit']
    
    # 批量生成所有行数据
    data = [[getattr(report, attr) for attr in rep_vals] for report in yearly_reports]
    
    # 直接创建DataFrame
    df = pd.DataFrame(data, columns=columns)
    
  • 处理可选属性(避免报错):
    若部分Report对象可能缺少指定属性,可给getattr()设置默认值:

    data = [[getattr(report, attr, None) for attr in rep_vals] for report in yearly_reports]
    

    属性不存在时会填充None,防止程序崩溃。

内容的提问来源于stack exchange,提问作者unfixed_income

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:50:22