多列层级Excel数据处理:合并股票代码列名及拆分子集DataFrame
问题描述
- 首次处理带**多级列(Multi-Level Columns)**的Excel文件,文件包含股票价格与变动数据
- 列结构:第一层级为股票代码(如APP、BHP),第二层级为数据字段(Price_last、daily_price等)
- 需求:
- 将股票代码与对应字段合并为
APP_Price_last格式的列名 - 将Dates列设为DataFrame索引
- 拆分出单只股票的子集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
相关产品推荐
相关产品推荐

