如何在Pandas中将二级索引合并为单级索引?附数据处理示例
Pandas数据提取与二级索引合并解决方案
原始数据
import pandas as pd import numpy as np df = pd.DataFrame({'ID': {0: 'id1', 1: 'id1', 2: 'id1'}, 'EM': {0: 'met1', 1: 'met2', 2: 'met3'}, 'met1_AVG': {0: 0.38, 1: np.nan, 2: np.nan}, 'met2_AVG': {0: np.nan, 1: 0.2, 2: np.nan}, 'met3_AVG': {0: np.nan, 1: np.nan, 2: 0.58}, 'score': {0: 89, 1: 89, 2: 89}})
期望输出

现有代码
df_melted = df.melt(id_vars=['ID','EM','score']).dropna(subset=['value']) df_pivoted = pd.pivot_table(data=df_melted,index=['ID','score'],columns=['variable']) df_ready = df_pivoted.reset_index() df_ready
一、正确提取目标数据
你的原始数据中,EM列的取值正好对应metX_AVG列的前缀,有两种简单方法得到期望格式:
方法1:直接匹配提取
利用EM列的值定位对应的AVG列,一步到位:
# 添加AVG列,匹配对应EM的AVG值 df['AVG'] = df.apply(lambda row: row[f"{row['EM']}_AVG"], axis=1) # 选取需要的列并去重(因为ID和score重复) result = df[['ID', 'score', 'EM', 'AVG']].drop_duplicates()
方法2:优化你的melt流程
你的melt已经筛选出了有效数据,不需要再做pivot,直接选取列即可:
df_melted = df.melt( id_vars=['ID','EM','score'], var_name='AVG_type', value_name='AVG' ).dropna(subset=['AVG']) # 保留需要的列,得到期望格式 result = df_melted[['ID', 'score', 'EM', 'AVG']]
两种方法最终输出都和期望一致:
ID score EM AVG 0 id1 89 met1 0.38 1 id1 89 met2 0.20 2 id1 89 met3 0.58
二、合并二级索引为单级索引
如果已经得到了带二级索引的DataFrame(比如你的df_ready),可以用以下几种方法合并:
方法1:拼接索引层级名称
如果需要保留两级索引的名称,直接拼接:
df_ready.columns = [f"{level0}_{level1}" for level0, level1 in df_ready.columns]
方法2:只保留二级索引名称
如果只需要二级索引的名称(比如你的场景中,一级索引是value,没有实际意义):
df_ready.columns = df_ready.columns.get_level_values(1)
方法3:过滤空值后拼接
处理部分层级为空的情况:
df_ready.columns = df_ready.columns.map(lambda x: '_'.join(filter(None, x)))
以你的df_ready为例,处理后列名会从(ID, )、(score, )、(value, met1_AVG)等变为ID、score、value_met1_AVG(或直接met1_AVG,根据需求选择方法)。
内容的提问来源于stack exchange,提问作者Amilovsky
相关产品推荐
相关产品推荐

