看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们可以对分类数据指定顺序,利用这些顺序进行相关的对比、排名等业务需求解决。如果分类数据是有序的(s.cat.ordered == True),则类别的顺序具有含义,并且可以进行某些操作。 如果类别是无序的,则.min()/.max() 将引发TypeError。
s = pd.Series(pd.Categorical(["a", "b", "c", "a"], ordered=False))
s.sort_values(inplace=True) # 排序
# 指定顺序
s = pd.Series(["a", "b", "c", "a"]).astype(CategoricalDtype(ordered=True))
s.sort_values(inplace=True)
s
'''
0 a
3 a
1 b
2 c
dtype: category
Categories (3, object): [a < b < c]
'''
s.min(), s.max()
# ('a', 'c')
可以使用 as_ordered() 将类别数据设置为排序,或者使用 as_unordered() 将类别数据设置为无序。 这些默认情况下将返回一个新对象。
s.cat.as_ordered()
'''
0 a
3 a
1 b
2 c
dtype: category
Categories (3, object): [a < b < c]
'''
s.cat.as_unordered()
'''
0 a
3 a
1 b
2 c
dtype: category
Categories (3, object): [a, b, c]
'''
可以通过 Categorical.reorder_categories() 和 Categorical.set_categories() 方法对类别进行重新排序。 对于 Categorical.reorder_categories(),所有旧类别都必须包含在新类别中,并且不允许新类别,这将必然使排序顺序与类别顺序相同。
s = pd.Series([1, 2, 3, 1], dtype="category")
s = s.cat.reorder_categories([2, 3, 1], ordered=True)
s
'''
0 1
1 2
2 3
3 1
dtype: category
Categories (3, int64): [2 < 3 < 1]
'''
s.sort_values(inplace=True)
s
'''
1 2
2 3
0 1
3 1
dtype: category
Categories (3, int64): [2 < 3 < 1]
'''
s.min(), s.max()
# (2, 1)
请注意分配新类别和重新排序类别之间的区别:第一个重命名类别,因此重命名了Series 中的各个值,但是如果第一个位置最后排序,则重命名的值仍将最后排序。 重新排序意味着之后对值进行排序的方式有所不同,但是不会更改系列中的各个值。
如果未分类,则 Series.min() 和 Series.max() 将引发 TypeError。 像 +,-,*,/
之类的数字运算以及基于它们的运算(例如 Series.median(),如果数组的长度为偶数,则需要计算两个值之间的平均值)不起作用,并引发TypeError。
分类列将以与其他列类似的方式参与多列排序,类别的顺序由该列的类别确定。
dfs = pd.DataFrame({'A': pd.Categorical(list('bbeebbaa'),
categories=['e', 'a', 'b'],
ordered=True),
'B': [1, 2, 1, 2, 2, 1, 2, 1]})
dfs.sort_values(by=['A', 'B'])
'''
A B
2 e 1
3 e 2
7 a 1
6 a 2
0 b 1
5 b 1
1 b 2
4 b 2
'''
重新排序类别将更改将来的排序:
dfs['A'] = dfs['A'].cat.reorder_categories(['a', 'b', 'e'])
dfs.sort_values(by=['A', 'B'])
'''
A B
7 a 1
6 a 2
0 b 1
5 b 1
1 b 2
4 b 2
2 e 1
3 e 2
'''
更新时间:2020-06-25 12:22:11 标签:pandas 分类数据 顺序