Python DataFrame未更新问题:股价赋值后单元格仍为0.0
问题原因
用iterrows()遍历DataFrame时,每次获取的row是原数据的副本,而非对原DataFrame行的引用。修改row的字段只会改变副本的值,无法同步到原fda1数据集,这就是打印结果仍为0.0的核心原因。
解决方案
方法1:通过df.loc[index, column]直接修改原数据
直接定位原DataFrame的单元格赋值,跳过副本修改的无效操作:
import datetime from datetime import timedelta for index, row in fda1.iterrows(): try: ticker = row['ticker'] print(ticker) end_date = row['date'].strftime('%Y-%m-%d') start_date120 = row['date'] - timedelta(days=120) start_date120 = start_date120.strftime('%Y-%m-%d') yahoo_financials = YahooFinancials(ticker) data = yahoo_financials.get_historical_price_data(start_date=start_date120, end_date=end_date, time_interval='daily') aapl_df = pd.DataFrame(data[ticker]['prices']) initialprice120 = float(aapl_df.iloc[0,4]) initialprice30 = float(aapl_df.iloc[20,4]) initialprice60 = float(aapl_df.iloc[40,4]) initialprice90 = float(aapl_df.iloc[60,4]) initialprice7 = float(aapl_df.iloc[78,4]) finalprice = float(aapl_df.iloc[-1,4]) # 用iloc[-1]简化最后一行的索引 # 直接修改原DataFrame对应位置 fda1.loc[index, 'finalprice'] = finalprice fda1.loc[index, 'initialprice120'] = initialprice120 fda1.loc[index, 'initialprice30'] = initialprice30 fda1.loc[index, 'initialprice60'] = initialprice60 fda1.loc[index, 'initialprice90'] = initialprice90 fda1.loc[index, 'initialprice7'] = initialprice7 except Exception as e: # 替换空except,打印错误信息便于排查 print(f"处理{ticker}时出错: {e}")
方法2:用apply函数(更贴合Pandas风格)
避免循环,通过apply逐行处理并返回修改后的行,直接更新原DataFrame:
import datetime from datetime import timedelta def get_prices(row): try: ticker = row['ticker'] end_date = row['date'].strftime('%Y-%m-%d') start_date120 = row['date'] - timedelta(days=120) start_date120 = start_date120.strftime('%Y-%m-%d') yahoo_financials = YahooFinancials(ticker) data = yahoo_financials.get_historical_price_data(start_date=start_date120, end_date=end_date, time_interval='daily') aapl_df = pd.DataFrame(data[ticker]['prices']) row['finalprice'] = float(aapl_df.iloc[-1,4]) row['initialprice120'] = float(aapl_df.iloc[0,4]) row['initialprice30'] = float(aapl_df.iloc[20,4]) row['initialprice60'] = float(aapl_df.iloc[40,4]) row['initialprice90'] = float(aapl_df.iloc[60,4]) row['initialprice7'] = float(aapl_df.iloc[78,4]) return row except Exception as e: print(f"处理{ticker}时出错: {e}") return row # 应用函数并更新原数据集 fda1 = fda1.apply(get_prices, axis=1)
额外提示
- 不要使用空
except:,它会隐藏所有异常(比如API请求失败、索引越界等),建议捕获具体异常或至少打印错误信息。 - 用
iloc[-1]替代iloc[len(aapl_df)-1],代码更简洁易读。
内容的提问来源于stack exchange,提问作者Gloria Dalla Costa
相关产品推荐
相关产品推荐

