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

如何在多级索引DataFrame中基于Y列值生成对应X列新列

解决多级索引DataFrame按Y列最大值匹配X列的问题

针对你的需求,我们可以通过apply结合nlargest来实现,步骤清晰且容易理解:

完整代码实现

import pandas as pd
import numpy as np

# 原DataFrame构建代码
level_2 = ['X', 'Y', 'X', 'Y', 'X', 'Y']
level_1 = ['A', 'A', 'B', 'B', 'C', 'C']
data = [['a1', 2, 'b1', 4, 'c1', 3], ['a2', 16, 'b2', 48, 'c2', 78], ['a3', 10, 'b3', 12, 'c3', 34], ['a4', 114, 'b4', 6, 'c4', 1]]
columns = pd.MultiIndex.from_tuples(list(zip(level_1, level_2)))
df = pd.DataFrame(data, columns=columns)

# 定义每行处理函数
def get_top_x(row):
    # 提取当前行中所有二级索引为Y的数值,索引对应一级索引的A/B/C
    y_values = row.xs('Y', level=1, axis=0)
    # 获取Y值最大的两个一级索引标签
    top_level1 = y_values.nlargest(2).index.tolist()
    # 根据标签匹配对应的X列值
    top_x_values = [row[(level1, 'X')] for level1 in top_level1]
    # 返回结果作为新增列
    return pd.Series(top_x_values, index=['Top1_X', 'Top2_X'])

# 应用函数生成新增列
df[['Top1_X', 'Top2_X']] = df.apply(get_top_x, axis=1)

print(df)

代码说明

  1. 提取Y列数值:row.xs('Y', level=1, axis=0)从每行中筛选出所有二级索引为Y的元素,得到一个以A/B/C为索引的Series,方便后续排序筛选。
  2. 获取最大两个Y值对应的标签:nlargest(2)直接返回Y值最大的两个元素的索引(即A/B/C中的两个),比argsort更直观,无需手动处理排序方向和切片。
  3. 匹配对应X列值:遍历筛选出的一级索引标签,通过row[(level1, 'X')]直接访问多级索引列,获取对应的X值。
  4. 生成新增列:将每行的结果转为Series,指定列名后直接赋值给原DataFrame,完成新增列操作。

输出结果

A     B     C       Top1_X Top2_X
   X  Y  X   Y  X   Y               
0  a1  2  b1   4  c1   3    b1     c1
1  a2 16  b2  48  c2  78    c2     b2
2  a3 10  b3  12  c3  34    c3     b3
3  a4 114 b4   6  c4   1    a4     b4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:20:34