如何将多个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
相关产品推荐
相关产品推荐

