为什么
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()
却起作用。
如果您查看文档:
与统计分类变量相比,分类数据可能有顺序(例如“强烈同意”与“同意”或“第一次观察”与“第二次观察”),但不可能进行数值运算(加法、除法……) .
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
。