函数内访问pandas DataFrame触发AttributeError:'function'无.loc属性
AttributeError: 'function' object has no attribute 'loc' 问题解决
问题根源
你的代码触发错误的核心原因是**dfDelta没有被正确初始化为DataFrame实例**:
在函数的这一行:
dfDelta=dfComponent[['Climate','Typology','CompCode','RunCode','MaxOT','MedianOT','MinOT','MaxMRT','MedianMRT','MinMRT','TPI','Comfortable','Cooling_unmet','DDH_Cooling','Heating_unmet','DDH_Heating','DDH','DDHSavings']].copy
这里的.copy是pandas DataFrame的方法,但你没有加括号()调用它,导致dfDelta被赋值为copy方法本身(函数对象),而不是复制后的DataFrame。后续代码尝试调用dfDelta.loc时,自然会抛出'function' object has no attribute 'loc'的错误。
修复方法
把上述代码行修改为:
dfDelta=dfComponent[['Climate','Typology','CompCode','RunCode','MaxOT','MedianOT','MinOT','MaxMRT','MedianMRT','MinMRT','TPI','Comfortable','Cooling_unmet','DDH_Cooling','Heating_unmet','DDH_Heating','DDH','DDHSavings']].copy()
通过添加括号()调用copy()方法,才能正确生成原DataFrame的副本,此时dfDelta就是标准的DataFrame对象,.loc属性可以正常使用。
额外优化建议
- 函数最后需要添加
return dfDelta语句,否则调用dfDeltaWall=DeltaCalc(dfWall,0)时,dfDeltaWall会是None - 索引定位可以简化:既然
idx已经是具体的索引值,无需用dfDelta.index==idx匹配,直接写dfDelta.loc[idx, 'MaxOT']即可,效率更高 - 多层for循环的效率较低,建议改用pandas的向量化操作(比如merge、groupby)替代,提升代码性能
修复后的完整函数示例
def DeltaCalc(dfComponent,code): ClimateList=dfComponent.Climate.unique() # 获取唯一气候类型 TypologyList=dfComponent.Typology.unique() # 获取唯一类型 CompCodeList=dfComponent.CompCode.unique() # 获取唯一组件编码 # 修复:添加()调用copy方法 dfDelta=dfComponent[['Climate','Typology','CompCode','RunCode','MaxOT','MedianOT','MinOT','MaxMRT','MedianMRT','MinMRT','TPI','Comfortable','Cooling_unmet','DDH_Cooling','Heating_unmet','DDH_Heating','DDH','DDHSavings']].copy() dfBaselineList=dfComponent[dfComponent.CompCode==code] for i in range(len(ClimateList)): if ClimateList[i]=='Cold': # Cold气候使用不同基线逻辑,跳过 continue for j in range(len(TypologyList)): dfBaselineTemp=dfBaselineList[(dfBaselineList.Climate==ClimateList[i])&(dfBaselineList.Typology==TypologyList[j])] # 临时存储对应气候+类型的基线数据 for k in range (len(CompCodeList)): idx=dfComponent[(dfComponent.Climate==ClimateList[i])&(dfComponent.Typology==TypologyList[j])&(dfComponent.CompCode==CompCodeList[k])].index.values idx=idx[0] # 将索引数组转为单个整数 # 简化索引定位 dfDelta.loc[idx,'MaxOT']=dfBaselineTemp['MaxOT'].values-dfComponent.loc[idx,'MaxOT'].values dfDelta.loc[idx,'MedianOT']=dfBaselineTemp['MedianOT'].values-dfComponent.loc[idx,'MedianOT'].values # 添加return语句返回结果 return dfDelta
内容的提问来源于stack exchange,提问作者Piyush Varma
相关产品推荐
相关产品推荐

