DataFrame中使用try-except仅替换错误单元格而非整行的实现问题
问题原因
你当前将整行所有指标的计算逻辑放在同一个try代码块中,任意一个指标计算触发KeyError或TypeError时,都会直接触发异常分支将整行赋值为Error,无法实现单个错误单元格替换的需求。另外你当前的异常捕获只覆盖了KeyError,遗漏了可能触发的TypeError甚至除零错误。
解决方案
可以封装一个独立的安全计算函数,对每个指标的计算单独做异常捕获,单个指标计算出错时仅返回Error,不影响其他指标的正常计算。
修改后的代码参考:
# 定义安全计算函数,捕获异常时返回Error def safe_calc(func, default="Error"): try: return func() except (KeyError, TypeError, ZeroDivisionError): # 可根据实际需求调整需要捕获的异常类型 return default # 逐个计算每个指标,每个指标独立捕获异常 row_data = [ stock, safe_calc(lambda: beta), safe_calc(lambda: dividendYield), safe_calc(lambda: (sharesOutstanding*close_price_num)/1000000000), safe_calc(lambda: '{:.2f}'.format(close_price_num)), safe_calc(lambda: (close_price_num/earnings/1000)), safe_calc(lambda: (EV/(final_df.at['Total Revenue', 'ttm'])/1000)), safe_calc(lambda: close_price_num/EE), safe_calc(lambda: EV/RE), safe_calc(lambda: float('{:.1f}'.format((RE/(final_df.at['Total Revenue', 'last year']*1000) - 1)*100))), safe_calc(lambda: EV/final_df.at['Normalized EBITDA', 'ttm']/1000), safe_calc(lambda: EV/1000000000), safe_calc(lambda: '{:.1f}'.format((FCF/(final_df.at['Total Revenue', 'ttm'])/10))), safe_calc(lambda: '{:.1f}'.format(final_df.at['Normalized EBITDA', 'ttm']/final_df.at['Total Revenue', 'ttm']*100)), safe_calc(lambda: (EV/(final_df.at['Normalized EBITDA', 'last year'] * (1 + (RE/(final_df.at['Total Revenue', 'last year']) - 1))))), '-' ] # 把构造好的行数据写入DataFrame Ratio_df.loc[stock] = row_data
内容的提问来源于stack exchange,提问作者Kevin John Abouzeid
相关产品推荐
相关产品推荐

