如何为与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 【问题描述】:我的数据框组由两个索引列(cat1
和cat2
)定义。对于第三个非索引变量var
,我想为cat1
的每个值找到var
的最大值的索引cat2
。
当我使用idxmax()
时,我得到cat1
和cat2
的整体索引值,对应于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中列的最大值对应的多索引的每个级别返回索引的主要内容,如果未能解决你的问题,请参考以下文章