如何在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
相关产品推荐
相关产品推荐

