2

I have a column like in the output and want to get in ascending order as starting from General-0 and increasing. I tried the below it doesn't work.How can I get this done? It's dtype shown as object.

dt.sort_values('run')

output

        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
0

3 Answers 3

2

The simpliest is if index values are not important use sorted with custom function:

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

If index values are important first split, select second values by str[1], cast to integers and for order use argsort with 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
Sign up to request clarification or add additional context in comments.

Comments

1

You can using split to build a helper key for your sort , then drop it after finished

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

Comments

1

You can use numpy.argsort together with pd.DataFrame.iloc.

This method maintains index from the original dataframe.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.