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

如何在MultiIndex中获取对应其他列最小值的列值

解决按分组取最小值对应列的问题

原始数据

import pandas as pd

data = [
    {"name": "cat", "var": "v1", "col1": 5, "col2": 7},
    {"name": "cat", "var": "v2", "col1": 4, "col2": 8},
    {"name": "dog", "var": "v1", "col1": 11, "col2": 15},
    {"name": "dog", "var": "v2", "col1": 12, "col2": 14},
]
df = pd.DataFrame(data)
print("DATA\n", df)

输出:

DATA
   name var  col1  col2
0  cat  v1     5     7
1  cat  v2     4     8
2  dog  v1    11    15
3  dog  v2    12    14

需求说明

获取每个name分组中,col1取最小值时对应的col2值,期望输出:

name  col2
cat   8
dog   15

你的思路优化与问题解答

疑问1:无需列举选中所有var的col1列

不需要手动列举("col1", "v1"), ("col1", "v2"),利用MultiIndex的层级索引特性,直接取第一层索引col1即可选中所有对应的var列:

df = df.pivot("name", "var", ["col1", "col2"])
# 直接选中col1层的所有列,无需逐个列举var
dfMinIdx = df['col1'].idxmin(axis=1)
print("\nMINIDX\n", dfMinIdx)

输出:

MINIDX
name
cat    v2
dog    v1
dtype: object

此时得到的直接是对应var值,比原元组形式更便于后续处理。

疑问2:通过元组Series访问MultiIndex结构

如果你已经生成了dfOtherIndex(元组形式),可以用apply逐行提取对应值:

dfOtherIndex = dfMinIdx.transform(lambda x: ("col2", x))
result = df.apply(lambda row: row[dfOtherIndex[row.name]], axis=1).to_frame('col2')

更高效的方式是利用lookup方法(基于优化后的dfMinIdx):

result = pd.DataFrame({
    'col2': df['col2'].lookup(dfMinIdx.index, dfMinIdx.values)
}, index=dfMinIdx.index)

两种方式都能得到符合预期的结果,其中lookup的执行效率更高。


更简洁的替代方案(无需pivot)

直接使用groupby结合idxmin一步到位,无需转换MultiIndex结构:

# 找到每个name分组中col1最小的行索引
min_col1_idx = df.groupby('name')['col1'].idxmin()
# 根据索引提取对应的col2值
result = df.loc[min_col1_idx, ['name', 'col2']].set_index('name')
print("\nRESULT\n", result)

输出:

RESULT
      col2
name      
cat      8
dog     15

这种方法步骤更少,适合处理大规模数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:06:20