如何为与python中列的最大值对应的多索引的每个级别返回索引

Posted

技术标签:

【中文标题】如何为与python中列的最大值对应的多索引的每个级别返回索引【英文标题】:How to return index for each level of a multiindex corresponding to the maximum value of a column in python 【发布时间】:2022-01-12 04:15:30 【问题描述】:

我的数据框组由两个索引列(cat1cat2)定义。对于第三个非索引变量var,我想为cat1 的每个值找到var 的最大值的索引cat2。 当我使用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

这是产生的结果:

期望的结果:

我不在乎格式。

【问题讨论】:

请提供可重现的数据,而不是图片。谢谢 【参考方案1】:

使用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,它返回全局最大值的索引。 但是您只想要每个组的最大值的索引,所以使用groupby.idxmax

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

【讨论】:

【参考方案2】:

有无数种方法可以创建此代码的输出。我演示了以下 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')

【讨论】:

以上是关于如何为与python中列的最大值对应的多索引的每个级别返回索引的主要内容,如果未能解决你的问题,请参考以下文章

具有多索引的 Pandas 样式对象

在熊猫数据框上设置多索引的最佳方法

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

合并两个具有多索引的数据框

如何在熊猫中使用具有多索引的地图?

带有多索引的 df.at 与 df.loc