【问题标题】:How to return index for each level of a multiindex corresponding to the maximum value of a column in python如何为与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

这是产生的结果:

期望的结果:

我不在乎格式。

【问题讨论】:

  • 请提供可重现的数据,而不是图片。谢谢

标签: python pandas dataframe multi-index


【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多