gpt4 book ai didi

python - 使用 pd.Categorical 对多索引 pd.Series 进行排序?

转载 作者:行者123 更新时间:2023-12-03 23:26:50 35 4
gpt4 key购买 nike


为什么排序使用 pd.Series.sort_index使用分类索引时似乎不起作用?如何使用字母/数字以外的其他排序顺序对多索引 pd.Series 的索引进行排序?
移动电源
设置代码

import pandas as pd 
import numpy as np

d = {
'Card': [
'Visa', 'Visa', 'Master Card', 'Master Card', 'Visa', 'Master Card',
'Visa', 'Visa', 'Master Card', 'Visa', 'Master Card', 'Visa', 'Visa',
'Master Card', 'Master Card', 'Visa', 'Master Card', 'Visa', 'Visa',
'Master Card', 'Visa', 'Master Card', 'Master Card', 'Master Card',
'Master Card', 'Master Card', 'Master Card', 'Visa', 'Visa'
],
'Year': [
'Three', 'Three', 'Seven', 'Three', 'Three', 'Seven', 'Seven', 'Seven',
'Three', 'Seven', 'Three', 'Three', 'Three', 'Seven', 'Three', 'Three',
'Seven', 'Seven', 'Seven', 'Three', 'Seven', 'Three', 'Five', 'One',
'One', 'Two', 'Four', 'Six', 'Six'
],
'Value': [
45, 13, 52, 321, 31, 1231, 876, 231, 4, 213, 123, 45, 321, 1, 123, 52,
736, 35, 900, 301, 374, 9, 294, 337, 4465, 321, 755, 22, 8
]
}

df = pd.DataFrame(d)
grp_cols = ['Card', 'Year']
ser_val = df.groupby(grp_cols)['Value'].mean()
天真只是使用 sort_index ,数据如下所示:
In [2]: ser_val.sort_index()
Out[2]:
Card Year
Master Card Five 294.000000
Four 755.000000
One 2401.000000
Seven 505.000000
Three 146.833333
Two 321.000000
Visa Seven 438.166667
Six 15.000000
Three 84.500000
Name: Value, dtype: float64
您可以看到列按字母顺序排序。现在,我想强制排序。为此,我尝试:
categories_order = ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven']
categories = pd.Categorical(ser_val.index.levels[1].values,
categories=categories_order,
ordered=True)
ser_val.index.set_levels(categories, level='Year', inplace=True)
再次,排序后,数据看起来像这样(再次,字母顺序)
In [3]: ser_val.sort_index()
Out[3]:
Card Year
Master Card Five 294.000000
Four 755.000000
One 2401.000000
Seven 505.000000
Three 146.833333
Two 321.000000
Visa Seven 438.166667
Six 15.000000
Three 84.500000
Name: Value, dtype: float64
我知道如果我将数据转换为 pandas.DataFrame 并在那里排序,它的工作原理是这样的:
df_val = ser_val.reset_index().sort_values(grp_cols)
df_val['Year'] = pd.Categorical(df_val['Year'].values,
categories_order,
ordered=True)
df_val = df_val.sort_values(grp_cols).set_index(grp_cols)


In [5]: df_val
Out[5]:
Value
Card Year
Master Card One 2401.000000
Two 321.000000
Three 146.833333
Four 755.000000
Five 294.000000
Seven 505.000000
Visa Three 84.500000
Six 15.000000
Seven 438.166667
为什么 pd.Series 不使用分类数据进行排序?
我在 Python 3.7.3 64 位中使用 Pandas 1.0.5

最佳答案

TLDR:您需要设置sort=False在您的 groupby ,并且您需要更改您的 CategoricalCategoricalIndex .这是完整的工作示例:

df = pd.DataFrame(d)
grp_cols = ['Card', 'Year']
ser_val = df.groupby(grp_cols, sort=False)['Value'].mean()

categories_order = ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven']
categories = pd.CategoricalIndex(ser_val.index.levels[1].values,
categories=categories_order,
ordered=True)
ser_val.index.set_levels(categories, level='Year', inplace=True)
ser_val.sort_index(inplace=True)
ser_val就是现在:
Card         Year 
Master Card One 2401.000000
Two 321.000000
Three 146.833333
Four 755.000000
Five 294.000000
Seven 505.000000
Visa Three 84.500000
Six 15.000000
Seven 438.166667
Name: Value, dtype: float64

更长的漫谈:你问为什么你所做的不起作用,我当然无法解释(我确定这涉及到源代码的一些根源),但这是我如何得出我的解决方案。
查看以下示例是否有效,从头开始构建玩具 MultiIndex 系列:
lets = ['a','b','c']*3
ids = ['MALE']*4 + ['FEMALE']*5
s = pd.Series(range(9), index=[ids,lets])

categories_order = ['b','a','c']
categories = pd.CategoricalIndex(s.index.levels[1].values,
categories=categories_order,
ordered=True)
s.index.set_levels(categories, level=1,inplace=True)
s.sort_index(inplace=True)
s按我们的意愿排序:
FEMALE  b    4
b 7
a 6
c 5
c 8
MALE b 1
a 0
a 3
c 2
dtype: int64
你的例子和我的(我可以说的)之间唯一的显着区别是你的从 groupby 开始。 .有一个 sort groupby 的参数:

sort : bool, default TrueSort group keys. Get better performance by turning this off. Note this does not influence the order of observations within each group. Groupby preserves the order of rows within each group.


所以它看起来像 groupby sort 正在强制执行一些不会被您的新分类顺序覆盖的顺序。
但是还在 sort=False ,您的代码原样不起作用。只是通过谷歌搜索,我发现 Categorical 有单独的类。和 CategoricalIndex ,显然后者正是您所需要的。如果 Categorical,我的例子肯定也会失败用于代替 CategoricalIndex .
所以 groupby事情似乎是更奇怪的问题;这里的基本规则我不能告诉你,但也许有人可以详细说明。

关于python - 使用 pd.Categorical 对多索引 pd.Series 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62860049/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com