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

多列层级Excel数据处理:合并股票代码列名及拆分子集DataFrame

问题描述
  • 首次处理带**多级列(Multi-Level Columns)**的Excel文件,文件包含股票价格与变动数据
  • 列结构:第一层级为股票代码(如APP、BHP),第二层级为数据字段(Price_last、daily_price等)
  • 需求:
    1. 将股票代码与对应字段合并为APP_Price_last格式的列名
    2. 将Dates列设为DataFrame索引
    3. 拆分出单只股票的子集DataFrame
  • 当前问题:使用列表推导式时,所有列名被替换为同一股票代码,无法自动匹配对应层级的代码,错误代码如下:
# 问题代码:所有列被替换为同一股票代码
new_columns = [str(df.columns[i]) + '_' + str(df.iloc[0, i]) for i in range(len(df.columns))]
df.columns = new_columns
解决方案

1. 正确合并多级列名

你的错误在于用df.iloc[0,i]去取股票代码——这是读取数据第一行的第i个值,而非列本身的层级信息。多级列的层级可以直接通过遍历列的元组来获取:

# 遍历每个列的多级元组,合并为"代码_字段"格式
df.columns = ['_'.join(col) for col in df.columns.values]

如果存在空的层级值,可先过滤再合并:

# 过滤空层级后合并列名
df.columns = ['_'.join(filter(None, col)) for col in df.columns.values]

2. 设置Dates列为索引

直接使用set_index方法完成:

# 将Dates列设为索引,inplace=True直接修改原DataFrame
df.set_index('Dates', inplace=True)

3. 拆分单只股票的子集

合并列名后,通过筛选列名包含目标股票代码的列即可提取子集:

# 提取APP的所有数据列
app_df = df.loc[:, df.columns.str.contains('APP')]
# 提取BHP的所有数据列
bhp_df = df.loc[:, df.columns.str.contains('BHP')]

完整示例代码

import pandas as pd

# 读取带多级列的Excel文件,header指定前两行作为列层级
df = pd.read_excel('your_stock_data.xlsx', header=[0, 1])

# 合并多级列名
df.columns = ['_'.join(col) for col in df.columns.values]

# 设置Dates为索引
df.set_index('Dates', inplace=True)

# 拆分单只股票子集
app_df = df.loc[:, df.columns.str.contains('APP')]
bhp_df = df.loc[:, df.columns.str.contains('BHP')]

# 查看结果
print(app_df.head())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:22:50