如何高效迭代指定属性从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
相关产品推荐
相关产品推荐

