通常按字母顺序排序。例如,我有一些变量被排序为'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))