My df
DataFrame index looks like this:
Com_Lag_01
Com_Lag_02
Com_Lag_03
Com_Lag_04
Com_Lag_05
Com_Lag_06
Com_Lag_07
Com_Lag_08
Com_Lag_09
Com_Lag_10
Com_Lag_101
Com_Lag_102
Com_Lag_103
...
Com_Lag_11
Com_Lag_111
Com_Lag_112
Com_Lag_113
Com_Lag_114
...
Com_Lag_12
Com_Lag_120
...
Com_Lag_13
Com_Lag_14
Com_Lag_15
I want to sort this index so that the numbers go from Com_Lag_1
to Com_Lag_120
. If I use df.sort_index()
I will get the same thing as above. Any suggestion on how to sort this index properly?
Solution without new column with DataFrame.reindex
by index
of sorted Series
:
a = df.index.to_series().str.rsplit('_').str[-1].astype(int).sort_values()
print (a)
Com_Lag_1 1
Com_Lag_3 3
Com_Lag_5 5
Com_Lag_12 12
Com_Lag_24 24
dtype: int32
df = df.reindex(index=a.index)
print (df)
Age Year
Com_Lag_1 27 1991
Com_Lag_3 22 2001
Com_Lag_5 31 1997
Com_Lag_12 25 2004
Com_Lag_24 34 2009
But if duplicated values is necessary add new column:
df = pd.DataFrame(\
{'Year': [1991 ,2004 ,2001 ,2009 ,1997],\
'Age': [27 ,25 ,22 ,34 ,31],\
},\
index = ['Com_Lag_1' ,'Com_Lag_12' ,'Com_Lag_3' ,'Com_Lag_24' ,'Com_Lag_12'])
print (df)
Age Year
Com_Lag_1 27 1991
Com_Lag_12 25 2004
Com_Lag_3 22 2001
Com_Lag_24 34 2009
Com_Lag_12 31 1997
df['indexNumber'] = df.index.str.rsplit('_').str[-1].astype(int)
df = df.sort_values(['indexNumber']).drop('indexNumber', axis=1)
print (df)
Age Year
Com_Lag_1 27 1991
Com_Lag_3 22 2001
Com_Lag_12 25 2004
Com_Lag_12 31 1997
Com_Lag_24 34 2009
Another solution is
df.sort_index(key=lambda x: (x.to_series().str[8:].astype(int)), inplace=True)
The 8 comes from the position where the numeric values start
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With