横向合并DataFrame时为列名添加股票名称以实现列名唯一
问题描述
我通过for循环结合字典获取多只股票的DataFrame,代码框架如下:
d={} fullset= pd.DataFrame () for name in stocklist: # 获取单只股票数据并存入d[name]的逻辑
目前使用以下代码横向合并数据集:
fullset= pd.concat([fullset, d[name]], axis=1)
所有数据集的列头完全相同,我需要在合并时将股票名称(即循环中的name变量)追加到对应DataFrame的每一列列名前,生成类似SPX-High、SPX-Low、Dow-High的列名。
*注:我了解层级列索引的方案,但未能成功实现;且后续需运行机器学习模型,不确定层级索引的兼容性,因此更倾向于直接为列名添加股票名称前缀。此前尝试使用concat的keys参数(如keys=d[name])及直接引用name变量,均未达到预期效果。
解决方案
方式一:循环内修改列名后合并
在循环中先为单只股票的DataFrame列名添加前缀,再执行合并操作:
d = {} fullset = pd.DataFrame() for name in stocklist: # 此处补充获取单只股票数据并存入d[name]的代码 # 示例:d[name] = yf.download(name, start='2020-01-01', end='2024-01-01') # 为列名添加股票名称前缀 d[name].columns = [f"{name}-{col}" for col in d[name].columns] # 合并到fullset fullset = pd.concat([fullset, d[name]], axis=1)
方式二:批量合并后扁平化列名(更高效)
若已将所有股票数据存入字典d,可一次性完成合并,再将层级列索引转为带前缀的普通列名,避免循环内反复concat的性能损耗:
# 假设字典d已包含所有股票的DataFrame fullset = pd.concat(d.values(), axis=1, keys=d.keys()) # 将层级列索引转换为"股票名称-列名"格式 fullset.columns = [f"{stock}-{col}" for stock, col in fullset.columns]
这种方式在股票数量较多时,效率远高于循环逐次合并。
内容的提问来源于stack exchange,提问作者Trav
相关产品推荐
相关产品推荐

