使用分类列根据数组对数据框进行排序
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
我有一个这样的数组:
['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