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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:05:46