如何在多级索引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)
代码说明
- 提取Y列数值:
row.xs('Y', level=1, axis=0)从每行中筛选出所有二级索引为Y的元素,得到一个以A/B/C为索引的Series,方便后续排序筛选。 - 获取最大两个Y值对应的标签:
nlargest(2)直接返回Y值最大的两个元素的索引(即A/B/C中的两个),比argsort更直观,无需手动处理排序方向和切片。 - 匹配对应X列值:遍历筛选出的一级索引标签,通过
row[(level1, 'X')]直接访问多级索引列,获取对应的X值。 - 生成新增列:将每行的结果转为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
相关产品推荐
相关产品推荐

