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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:15:38