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

添加至DataFrame的新列无法保存到Excel文件问题求助

问题原因及解决办法

你的问题出在遍历DataFrame的方式上:df.itertuples()返回的是不可变的namedtuple对象,你在循环里修改row[8]根本不会同步到原DataFrame里,所以最后保存的Excel里buy?列还是空值。

下面给两种可行的解决方式:

方式一:改用iterrows()遍历(适合小数据集)

iterrows()返回的是(index, row)对,其中row是Series对象,可以通过索引定位修改原DataFrame:

import yfinance as yf
import pandas as pd

stock_data = yf.download(tickers="AAPL", interval="1d", period="3y") 

stock_data['SMA50'] = stock_data['Close'].rolling(window=50).mean()
stock_data['SMA200'] = stock_data['Close'].rolling(window=200).mean()
stock_data['buy?'] = ""

df = pd.DataFrame(stock_data)

for idx, row in df.iterrows():
    sma200 = row['SMA200']
    close = row['Close']
    if sma200 > close:
        print("buy!")
        df.loc[idx, 'buy?'] = "buy!"

writer = pd.ExcelWriter('AAPL.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name="datas", startrow=1, header=False, index=True)
writer.close()

方式二:用pandas向量化操作(推荐,效率更高)

pandas的核心是向量化运算,比循环快得多,尤其适合大数据集:

import yfinance as yf
import pandas as pd

stock_data = yf.download(tickers="AAPL", interval="1d", period="3y") 

stock_data['SMA50'] = stock_data['Close'].rolling(window=50).mean()
stock_data['SMA200'] = stock_data['Close'].rolling(window=200).mean()
# 直接用条件判断赋值,一步到位
stock_data['buy?'] = stock_data.apply(lambda row: "buy!" if row['SMA200'] > row['Close'] else "", axis=1)

df = pd.DataFrame(stock_data)

writer = pd.ExcelWriter('AAPL.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name="datas", startrow=1, header=False, index=True)
writer.close()

另外补充两点:

  • 你不需要把stock_data再转成df = pd.DataFrame(stock_data),因为yf.download返回的本身就是DataFrame,直接用就行
  • 保存Excel时如果不需要额外格式设置,直接用df.to_excel('AAPL.xlsx', sheet_name="datas", startrow=1, header=False, index=True)更简洁

内容的提问来源于stack exchange,提问作者Berk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:22:38