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

如何将多个Pandas DataFrame保存至单个Excel文件的不同工作表

问题需求

现有Python代码通过yfinance获取股票数据,定义函数计算不同周期涨跌幅,并用apply批量处理df_Industry中两家公司的数据,当前已将结果合并为单个DataFrame。需要将两家公司的结果分别保存至单个Excel文件的不同工作表,工作表名称对应df_Industry中的公司名称。

原代码

计算涨跌幅的函数

import pandas as pd
import yfinance as yF
import datetime
from functools import reduce


def get_returns_change_period(tic,com,OHLC_COL1,OHLC_COL2):
    df_Stock = yF.download(tickers = tic, period = "38y", interval = "1mo", prepost = False, repair = False)
    df_Stock['MONTH'] = pd.to_datetime(df_Stock.index)
    df_Stock = df_Stock.sort_values(by='MONTH')
    
    df_Stock[com + ' % Change '+'3M'] = (((df_Stock[OHLC_COL1].shift(2) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'3M'] = (df_Stock[com + ' % Change '+'3M'] * 100 )/df_Stock[OHLC_COL2]
    
    
    df_Stock[com + ' % Change '+'2M'] = (((df_Stock[OHLC_COL1].shift(1) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'2M'] = (df_Stock[com + ' % Change '+'2M'] * 100 )/df_Stock[OHLC_COL2]
    
    
    df_Stock[com + ' % Change '+'M'] = (((df_Stock[OHLC_COL1].shift(0) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'M'] = (df_Stock[com + ' % Change '+'M'] * 100 )/df_Stock[OHLC_COL2]
    
          
    return df_Stock.filter(regex='% Change')

函数调用及后续代码

get_returns_change_period('XOM','EXXON MOBIL','High','Open')

df_Industry = pd.DataFrame({'ID':['1', '2'], 'Ticker': ['AIN', 'TILE'], 'Company':['Albany International', 'Interface']})

df1 = df_Industry.apply(lambda x: get_returns_change_period(x.Ticker, x.Company, 'High','Open'), axis=1)

merged_df = pd.concat(df1.tolist(), axis=1)
merged_df

#merged_df.to_excel("output.xlsx")
#merged_df.to_csv("output.csv", index=False)

解决方案

不需要合并成单个DataFrame,直接使用pd.ExcelWriter将每家公司的数据写入对应名称的工作表即可。修改后的完整代码如下:

import pandas as pd
import yfinance as yF
import datetime
from functools import reduce

def get_returns_change_period(tic,com,OHLC_COL1,OHLC_COL2):
    df_Stock = yF.download(tickers = tic, period = "38y", interval = "1mo", prepost = False, repair = False)
    df_Stock['MONTH'] = pd.to_datetime(df_Stock.index)
    df_Stock = df_Stock.sort_values(by='MONTH')
    
    df_Stock[com + ' % Change '+'3M'] = (((df_Stock[OHLC_COL1].shift(2) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'3M'] = (df_Stock[com + ' % Change '+'3M'] * 100 )/df_Stock[OHLC_COL2]
    
    df_Stock[com + ' % Change '+'2M'] = (((df_Stock[OHLC_COL1].shift(1) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'2M'] = (df_Stock[com + ' % Change '+'2M'] * 100 )/df_Stock[OHLC_COL2]
    
    df_Stock[com + ' % Change '+'M'] = (((df_Stock[OHLC_COL1].shift(0) - df_Stock[OHLC_COL2]))/df_Stock[OHLC_COL2]) *100          
    df_Stock[com + ' % Change '+'M'] = (df_Stock[com + ' % Change '+'M'] * 100 )/df_Stock[OHLC_COL2]
    
    return df_Stock.filter(regex='% Change')

# 定义公司列表
df_Industry = pd.DataFrame({'ID':['1', '2'], 'Ticker': ['AIN', 'TILE'], 'Company':['Albany International', 'Interface']})

# 批量获取每家公司的涨跌幅数据
df1 = df_Industry.apply(lambda x: get_returns_change_period(x.Ticker, x.Company, 'High','Open'), axis=1)

# 写入Excel文件,每家公司对应一个工作表
with pd.ExcelWriter('company_stock_returns.xlsx') as writer:
    for idx, company in enumerate(df_Industry['Company']):
        df1.iloc[idx].to_excel(writer, sheet_name=company)

关键说明

  • 使用pd.ExcelWriter上下文管理器,自动处理文件的打开和关闭,避免资源泄漏
  • 遍历df_Industry中的公司名称,将df1中对应位置的DataFrame写入以公司名为名称的工作表
  • 跳过合并步骤,直接处理单个公司的数据,更高效且符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:19:50