如何在python中提供自定义排序选项



通常按字母顺序排序。例如,我有一些变量被排序为'A' > 'B' > 'C' > 'D' > 'E' > 'I'。但我想把这些值按'A' > 'B' > 'C' > 'D' > 'I' > 'E'排序,但这很困难,因为E在字母表中排在I之前。那么,在这种情况下,我如何使用python进行自定义订单以确保我在E之前运行?

一种简单的方法是将列转换为有序的分类dtype:

# Create a new dtype
cat = pd.CategoricalDtype(['A', 'B', 'C', 'D', 'I', 'E'], ordered=True)
# Apply it
df['var'] = df['var'].astype(cat)
# Sort by 'var'
df = df.sort_values('var', ignore_index=True)

排序前:

>>> df
var  val
0   E    5
1   C    1
2   A    7
3   I    9
4   B    8
5   A    4
6   D    5
7   A    6
8   E    8
9   E    7

排序后:

>>> df
var  val
0   A    7
1   A    4
2   A    6
3   B    8
4   C    1
5   D    5
6   I    9  # As expected, 'I' is before 'E'
7   E    5
8   E    8
9   E    7

尝试创建pd。CategoricalDtype如下:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.choice([*'ABCDEI'], 50), columns=['Letter'])
catdtype = pd.CategoricalDtype([*'ABCDIE'], ordered=True)
df['Letter'] = df['Letter'].astype(catdtype)
df.sort_values('Letter', ascending=False).head(20)

输出:

Letter
0       E
3       E
27      E
43      E
9       E
10      E
45      I
29      I
39      I
19      I
13      I
30      I
11      D
23      D
2       D
46      D
18      D
47      D
8       D
28      C

您可以创建一个键列表,并将其用作对数据框架进行排序的参数。像这样:

custom_key = ...
df.sort_values(by= "target column", key= custom_key)

如果这是一个数据框,您可以通过使用。where

提取您需要的数据来进行排序。
dfe = df.where(df["letter"] == "E")
dfe = dfe.dropna(subset="letter")

,然后在末尾使用

重新插入
df = pd.concat([df, dfe])
df.drop_duplicates(keep='last')

如果这不是一个数据框架,请提供更多信息。我也知道这不是"最快的"。这样做,但它应该工作。

您也可以在df.sort_values(key=your_list_here)

中创建一个密钥

使用enumerate()

d = {c:n for n,c in enumerate(['A', 'B', 'C', 'D', 'I', 'E'])}
df.sort_values('Var',key = lambda x: x.map(d))

相关内容

  • 没有找到相关文章

最新更新