为什么 max() 不起作用,但 idxmax() 对 Pandas 中的“类别”dtype 起作用?

问题描述 投票:0回答:1

为什么

max()
不起作用,但
idxmax()
在 Pandas 的“类别”数据类型上起作用?

import pandas as pd

s = pd.Series([1, 4, 3], index=['a', 'b', 'c'])
s = s.astype('category')

# print(s.max())  # it doesn't work.
# "you can use .as_ordered() to change the Categorical to an ordered one"

print(s.idxmax())

如果

s.max()
不起作用,那么
idxmax()
也不应该起作用似乎是合乎逻辑的!

我已阅读文档,但仍然不明白为什么

s.max()
不起作用,而
s.idxmax()
却起作用。

python pandas categorical-data
1个回答
0
投票

如果您查看文档

与统计分类变量相比,分类数据可能有顺序(例如“强烈同意”与“同意”或“第一次观察”与“第二次观察”),但不可能进行数值运算(加法、除法……) .

max()
需要一种方法来比较值以确定最大值,而无序类别没有定义的比较顺序。

文档中的进一步内容,排序和顺序

如果分类数据是有序的(

s.cat.ordered == True
),那么类别的顺序就有意义,并且可以进行某些操作。如果分类是无序的,
.min()/.max()
将引发
TypeError

这就是在您的系列上使用

s.max
时出现错误的原因。

为什么
idxmax
有效?

为此,我鼓励您阅读来源。这是关键部分:

if numeric_only:
    data = self._get_numeric_data()
else:
    data = self

res = data._reduce(
    nanops.nanargmax, "argmax", axis=axis, skipna=skipna, numeric_only=False
)

简而言之,

idxmax
依赖于分类数据的内码,因此无需对类别进行排序即可找到最大值的索引。

idxmax
返回第一次出现最大值的索引。因此,在您的系列中,它会找到最大值
4
,并返回该值的索引,即
b

© www.soinside.com 2019 - 2024. All rights reserved.