使用分类列根据数组对数据框进行排序

Use a categorical column to order the dataframe according to an array

我有一个这样的数组:

['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

您可以将 CA 列设置为 index,然后根据您的 specified list

最后设置 reindex
d = [[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']]

df = pd.DataFrame(d , columns=['BIN', 'CA', 'SUM'])

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

df2 = df.set_index('SUM').reindex(l)
df2.dropna(inplace=True) #dropna is required of your list has some element that is not in the original dataframe, in this case A 500
df2
SUM      BIN    CA
    
A 100   100.0   A
A 200   200.0   A
A 300   300.0   A
A 400   400.0   A
B 100   100.0   B
B 200   200.0   B
B 300   300.0   B
B 400   400.0   B
``

您可以使用 pd.Categorical to convert the SUM column to categorical column having order, then sort 值:

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

或者,您可以创建一个字典,将 arr 中的项目映射到它们的排序顺序,然后 .map this dictionary on SUM column and use 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