【Python笔记】Pandas自定义排序

Method1:Map

import pandas as pd

df = pd.DataFrame({
    'cloth_id': [1001, 1002, 1003, 1004, 1005, 1006],
    'size': ['S', 'XL', 'M', 'XS', 'L', 'S'],
})
cloth_idsize
01001S
11002XL
21003M
31004XS
41005L
51006S
# 创建自定义排序
df_mapping = pd.DataFrame({
    'size': ['XS', 'S', 'M', 'L', 'XL'],
})

sort_mapping = df_mapping.reset_index().set_index('size')
sort_mapping
index
size
XS0
S1
M2
L3
XL4
# 之后,使用sort_mapping中的映射值创建一个新的列 size_num
df['size_num'] = df['size'].map(sort_mapping['index'])
# 最后,按新的列大小对值进行排序
df.sort_values('size_num')
cloth_idsizesize_num
31004XS0
01001S1
51006S1
21003M2
41005L3
11002XL4

Method2:CategoricalDtype

单个变量排序

导入模块,然后,创建一个自定义类别类型cat_size_order

  • 第一个参数设置为['XS'、'S'、'M'、'L'、'XL']作为尺寸的唯一值
  • 第二个参数ordered=True,将此变量视为有序
from pandas.api.types import CategoricalDtype

cat_size_order = CategoricalDtype(
    ['XS', 'S', 'M', 'L', 'XL'], 
    ordered=True
)

然后,调用astype(cat_size_order)将大小数据强制转换为自定义类别类型。通过运行df['size'],我们可以看到size列已经被转换为一个类别类型,其顺序为[XS<S<M<L<XL]

df['size'] = df['size'].astype(cat_size_order)
df['size']
0     S
1    XL
2     M
3    XS
4     L
5     S
Name: size, dtype: category
Categories (5, object): [XS < S < M < L < XL]
df.sort_values('size')
cloth_idsizesize_num
31004XS0
01001S1
51006S1
21003M2
41005L3
11002XL4
df['codes'] = df['size'].cat.codes
df
cloth_idsizesize_numcodes
01001S11
11002XL44
21003M22
31004XS00
41005L33
51006S11

我们可以看到XS、S、M、L和XL的代码分别为0、1、2、3、4和5。codes是类别实际值。通过运行df.info(),我们可以看到实际上是int8。

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype   
---  ------    --------------  -----   
 0   cloth_id  6 non-null      int64   
 1   size      6 non-null      category
 2   size_num  6 non-null      int64   
 3   codes     6 non-null      int8    
dtypes: category(1), int64(2), int8(1)
memory usage: 436.0 bytes

多个变量排序

df = pd.DataFrame({
    'order_id': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
    'customer_id': [10, 12, 12, 12, 10, 10, 10],
    'month': ['Feb', 'Jan', 'Jan', 'Feb', 'Feb', 'Jan', 'Feb'],
    'day_of_week': ['Mon', 'Wed', 'Sun', 'Tue', 'Sat', 'Mon', 'Thu'],
})
order_idcustomer_idmonthday_of_week
0100110FebMon
1100212JanWed
2100312JanSun
3100412FebTue
4100510FebSat
5100610JanMon
6100710FebThu

类似地,让我们创建两个自定义类别类型cat_day_of_weekcat_month,并将它们传递给astype()

cat_day_of_week = CategoricalDtype(
    ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], 
    ordered=True
)

cat_month = CategoricalDtype(
    ['Jan', 'Feb', 'Mar', 'Apr'], 
    ordered=True,
)

df['day_of_week'] = df['day_of_week'].astype(cat_day_of_week)
df['month'] = df['month'].astype(cat_month)

要按多个变量排序,我们只需要传递一个列表来代替sort_values()。例如,按monthday_of_week排序

df.sort_values(['customer_id', 'month', 'day_of_week'])
order_idcustomer_idmonthday_of_week
5100610JanMon
0100110FebMon
6100710FebThu
4100510FebSat
1100212JanWed
2100312JanSun
3100412FebTue

Reference:如何对Pandas DataFrame进行自定义排序

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值