J'ai une colonne comme dans la sortie et je souhaite obtenir un ordre croissant en partant de General-0 et en augmentant. J'ai essayé ci-dessous, cela ne fonctionne pas. Comment puis-je faire cela? C'est dtype montré comme objet.

dt.sort_values('run')

Production

        run               
717   General-25-20180121-15:27:27-3807  
824   General-26-20180121-15:27:28-3812  
931   General-27-20180121-15:27:29-3818  
1038  General-28-20180121-15:27:30-3823  
1145  General-29-20180121-15:27:30-3828  
1252  General-30-20180121-15:27:31-3833  
1359  General-31-20180121-15:27:31-3838  
1466  General-32-20180121-15:27:32-3843  
1573  General-33-20180121-15:27:33-3848  
1680  General-34-20180121-15:27:33-3855 
1787   General-0-20180121-15:27:08-3680 
1894   General-1-20180121-15:27:09-3685  
2001   General-2-20180121-15:27:10-3690  
2108   General-3-20180121-15:27:11-3695  
2215   General-4-20180121-15:27:11-3700  
2322   General-5-20180121-15:27:12-3706
2
Ozie 17 avril 2018 à 19:14

3 réponses

Meilleure réponse

Vous pouvez utiliser split pour créer une clé d'assistance pour votre tri, puis drop après avoir terminé

df.assign(helpkey=df.run.str.split('-',expand=True)[1].astype(int)).sort_values('helpkey').drop('helpkey',1)
Out[750]: 
                                    run
1787   General-0-20180121-15:27:08-3680
1894   General-1-20180121-15:27:09-3685
2001   General-2-20180121-15:27:10-3690
2108   General-3-20180121-15:27:11-3695
2215   General-4-20180121-15:27:11-3700
2322   General-5-20180121-15:27:12-3706
717   General-25-20180121-15:27:27-3807
824   General-26-20180121-15:27:28-3812
931   General-27-20180121-15:27:29-3818
1038  General-28-20180121-15:27:30-3823
1145  General-29-20180121-15:27:30-3828
1252  General-30-20180121-15:27:31-3833
1359  General-31-20180121-15:27:31-3838
1466  General-32-20180121-15:27:32-3843
1573  General-33-20180121-15:27:33-3848
1680  General-34-20180121-15:27:33-3855
1
YOBEN_S 17 avril 2018 à 16:18

Le plus simple est que si les valeurs d'index ne sont pas importantes, utilisez sorted avec une fonction personnalisée:

df['run'] = sorted(df['run'], key=lambda x: int(x.split('-')[1]))
print (df)
                                    run
717    General-0-20180121-15:27:08-3680
824    General-1-20180121-15:27:09-3685
931    General-2-20180121-15:27:10-3690
1038   General-3-20180121-15:27:11-3695
1145   General-4-20180121-15:27:11-3700
1252   General-5-20180121-15:27:12-3706
1359  General-25-20180121-15:27:27-3807
1466  General-26-20180121-15:27:28-3812
1573  General-27-20180121-15:27:29-3818
1680  General-28-20180121-15:27:30-3823
1787  General-29-20180121-15:27:30-3828
1894  General-30-20180121-15:27:31-3833
2001  General-31-20180121-15:27:31-3838
2108  General-32-20180121-15:27:32-3843
2215  General-33-20180121-15:27:33-3848
2322  General-34-20180121-15:27:33-3855

Si les valeurs d'index sont importantes d'abord {{X0} }, sélectionnez les secondes valeurs par str[1], transtypez en nombres entiers et pour l'ordre, utilisez argsort avec iloc:

df = df.iloc[df['run'].str.split('-').str[1].astype(int).argsort()]
print (df)
                                    run
1787   General-0-20180121-15:27:08-3680
1894   General-1-20180121-15:27:09-3685
2001   General-2-20180121-15:27:10-3690
2108   General-3-20180121-15:27:11-3695
2215   General-4-20180121-15:27:11-3700
2322   General-5-20180121-15:27:12-3706
717   General-25-20180121-15:27:27-3807
824   General-26-20180121-15:27:28-3812
931   General-27-20180121-15:27:29-3818
1038  General-28-20180121-15:27:30-3823
1145  General-29-20180121-15:27:30-3828
1252  General-30-20180121-15:27:31-3833
1359  General-31-20180121-15:27:31-3838
1466  General-32-20180121-15:27:32-3843
1573  General-33-20180121-15:27:33-3848
1680  General-34-20180121-15:27:33-3855
2
jezrael 17 avril 2018 à 16:27

Vous pouvez utiliser numpy.argsort avec pd.DataFrame.iloc .

Cette méthode conserve l'index de la trame de données d'origine.

res = df.iloc[np.argsort([int(i.split('-')[1]) for i in df['run']])]

print(res)

#                                     run
# 1787   General-0-20180121-15:27:08-3680
# 1894   General-1-20180121-15:27:09-3685
# 2001   General-2-20180121-15:27:10-3690
# 2108   General-3-20180121-15:27:11-3695
# 2215   General-4-20180121-15:27:11-3700
# 2322   General-5-20180121-15:27:12-3706
# 717   General-25-20180121-15:27:27-3807
# 824   General-26-20180121-15:27:28-3812
# 931   General-27-20180121-15:27:29-3818
# 1038  General-28-20180121-15:27:30-3823
# 1145  General-29-20180121-15:27:30-3828
# 1252  General-30-20180121-15:27:31-3833
# 1359  General-31-20180121-15:27:31-3838
# 1466  General-32-20180121-15:27:32-3843
# 1573  General-33-20180121-15:27:33-3848
# 1680  General-34-20180121-15:27:33-3855
1
jpp 17 avril 2018 à 16:22