Python 按两个条件对列进行排序

Python 按两个条件对列进行排序,python,dataframe,Python,Dataframe,我得到了一个结果列表,我想根据两个标准对其进行排序。 我对sys列执行了第一次排序: systems = {'BzBz_S':0,'BzBz_PD34':1,'MeMe':2} sorted_results = sorted(results, key = lambda e: (systems[e[0]])) 并传递给数据帧 df = pd.DataFrame(sorted_results,columns = ['sys','dis','basis','Energy']) 这为我提供了以下输出

我得到了一个结果列表,我想根据两个标准对其进行排序。 我对sys列执行了第一次排序:

systems = {'BzBz_S':0,'BzBz_PD34':1,'MeMe':2}
sorted_results = sorted(results, key = lambda e: (systems[e[0]]))
并传递给数据帧

df = pd.DataFrame(sorted_results,columns = ['sys','dis','basis','Energy'])
这为我提供了以下输出:

,sys,dis,system,basis,Energy
0,BzBz_S,10.0,BzBz_S_10.0,S,0.02562465
1,BzBz_S,3.2,BzBz_S_3.2,S,1.48510297
2,BzBz_S,3.3,BzBz_S_3.3,S,-0.25086498
3,BzBz_S,6.0,BzBz_S_6.0,S,-0.11827975
4,BzBz_S,3.9,BzBz_S_3.9,S,-2.44705244
5,BzBz_PD34,0.4,BzBz_PD34_0.4,PD34,-1.88172312
6,BzBz_PD34,0.2,BzBz_PD34_0.2,PD34,-1.50519034
7,MeMe,5.0,MeMe_5.0,5,-0.12194283
8,MeMe,5.4,MeMe_5.4,5,-0.07556324
除了sys之外,如何创建第二个排序标准来对dis列进行排序,以获得这样的最终结果:

,sys,dis,system,basis,Energy
0,BzBz_S,3.2,BzBz_S_3.2,S,1.48510297
1,BzBz_S,3.3,BzBz_S_3.3,S,-0.25086498
2,BzBz_S,3.9,BzBz_S_3.9,S,-2.44705244 
3,BzBz_S,6.0,BzBz_S_6.0,S,-0.11827975
4,BzBz_S,10.0,BzBz_S_10.0,S,0.02562465
5,BzBz_PD34,0.2,BzBz_PD34_0.2,PD34,-1.50519034
6,BzBz_PD34,0.4,BzBz_PD34_0.4,PD34,-1.88172312
7,MeMe,5.0,MeMe_5.0,5,-0.12194283
8,MeMe,5.4,MeMe_5.4,5,-0.07556324

在获得第一个输出后,您可以执行以下操作以获得最终输出,希望这对您有所帮助

df['sys_cat']=df['sys'].astype('category')  #creating a categorical column in the dataframe

d = dict(zip(df.sys_cat,df.sys_cat.cat.codes)) # converting categorical column into codes

# reassigning categories
count=0
for i in d:
    d[i]=count
    count+=1

df['sys_cat']=df['sys_cat'].map(d).astype(int)
df.sort_values(by=['sys_cat', 'dis'],ascending=[True, True], inplace=True)
df.drop(['sys_cat'], inplace=True, axis=1)
df.reset_index(inplace=True, drop=True)
df
给出:

          sys   dis            system   basis      Energy
0      BzBz_S   3.2        BzBz_S_3.2   S        1.485103
1      BzBz_S   3.3        BzBz_S_3.3   S       -0.250865
2      BzBz_S   3.9        BzBz_S_3.9   S       -2.447052
3      BzBz_S   6.0        BzBz_S_6.0   S       -0.118280
4      BzBz_S   10.0      BzBz_S_10.0   S        0.025625
5   BzBz_PD34   0.2     BzBz_PD34_0.2   PD34    -1.505190
6   BzBz_PD34   0.4     BzBz_PD34_0.4   PD34    -1.881723
7        MeMe   5.0          MeMe_5.0   5       -0.121943
8        MeMe   5.4          MeMe_5.4   5       -0.075563

这回答了你的问题吗?我以前试过。如果我按两列对数据进行排序:df.sort_值(['sys',dis'],升序=[True,False],inplace=True),我会把sys列弄乱,因为它是按字母顺序排序的。我想您需要df.sort_值(['sys',dis'],升序=[True,True],inplace=True)--字母顺序应该不会有问题,不幸的是,它没有按我想要的方式工作。虽然dis列排序正确,但sys列的顺序为:BzBZ_PD34、BzBZ_S、MeMe。