return如何为python中某列的最大值对应的multiindex的每一层建立索引

How to return index for each level of a multiindex corresponding to the maximum value of a column in python

我的数据框组由两个索引列(cat1cat2)定义。对于第三个非索引变量 var,我想找到索引 cat2,对于 cat1 的每个值 var 的最大值。 当我使用 idxmax() 时,我得到 cat1cat2 的总索引值对应于 var 的最大值 (B,dog)。我想要 cat1.

每个级别的这个值
df = pd.DataFrame({
    'cat1': ['A'] * 4 + ['B'] * 4 + ['C'] * 4,
    'cat2': ['cat', 'dog', 'mouse', 'bear'] * 3,
    'var': [23, 33, 45, 66, 77, 88, 44, 55, 33, 22, 11, 44],
}).set_index(['cat1', 'cat2'])

            var
cat1 cat2      
A    cat     23
     dog     33
     mouse   45
     bear    66
B    cat     77
     dog     88
     mouse   44
     bear    55
C    cat     33
     dog     22
     mouse   11
     bear    44

这是生成的结果:

想要的结果:

我不关心格式。

使用groupby.idxmax:

df.groupby('cat1').idxmax()  # or df.groupby(level=0).idxmax()

#             var
# cat1           
# A     (A, bear)
# B      (B, dog)
# C     (C, bear)
  • 您当前的代码使用 DataFrame.idxmax,其中 returns global max.
  • 的索引
  • 然而你只想要每组最大值的索引,所以使用groupby.idxmax.

(如 sammywemmy 所说,以后请将示例数据帧作为可复制粘贴代码而不是图像提供。)

有无数种方法可以创建此代码的输出。我演示了以下 3 种方式:

MaxEachcat1 = df[df['var'] == df.groupby(level=[0])['var'].transform(max)]

print(MaxEachcat1)
print(MaxEachcat1.index)
print(MaxEachcat1.index[0])

输出:

# way 1
            var
cat1 cat2
A    bear   66
B    dog    88
C    bear   44

# way 2
MultiIndex([('A', 'bear'),
            ('B',  'dog'),
            ('C', 'bear')],
           names=['cat1', 'cat2'])

# way 3
('A', 'bear')