首页 > 解决方案 > 使用分类列根据数组对数据框进行排序

问题描述

我有一个这样的数组:

['A 100', 'A 200', 'A 300', 'A 400', 'A 500', 'B 100', 'B 200', 'B 300', 'B 400']

我也有这样的数据框:

BIN      CA      SUM
100       B      B 100
300       A      A 300
300       B      B 300
400       B      B 400
400       A      A 400
200       B      B 200
100       A      A 100
200       A      A 200

我想用来pd.Categorical根据数组对列数据框进行排序。

预期的输出是:

BIN      CA      SUM
100       A      A 100
200       A      A 200
300       A      A 300
400       A      A 400
100       B      B 100
200       B      B 200
300       B      B 300
400       B      B 400

标签: pythonpandasdataframecategorical-data

解决方案


您可以使用pd.CategoricalSUM列转换为具有顺序的分类列,然后sort是值:

df['SUM'] = pd.Categorical(df['SUM'], categories=arr, ordered=True)
df.sort_values('SUM')

或者,您可以创建一个字典,将项目映射arr到它们的排序顺序,然后.mapSUM列上创建这个字典,并使用它np.argsort来获取将对数据帧进行排序的索引:

dct = {v: i for i, v in enumerate(arr)}
df.iloc[np.argsort(df['SUM'].map(dct))]

   BIN CA    SUM
6  100  A  A 100
7  200  A  A 200
1  300  A  A 300
4  400  A  A 400
0  100  B  B 100
5  200  B  B 200
2  300  B  B 300
3  400  B  B 400

推荐阅读