添加至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
相关产品推荐
相关产品推荐

