You can use extract
, convert to int
and get position of sorted values by argsort
, last use iloc
:
(borrowing data from @Dark):
df = df.iloc[df.index.str.extract('(\d+)', expand=False).astype(int).argsort()]
print (df)
0
a5 5
a6 6
a10 2
a11 3
b11 7
a12 1
b12 8
a15 4
Explanation:
df = pd.DataFrame([1,2,3,4,5,6,7,8],index=['a12','a10','a11','a15','a5','a6','b11','b12'])
print (df)
0
a12 1
a10 2
a11 3
a15 4
a5 5
a6 6
b11 7
b12 8
First extract
all integers:
print (df.index.str.extract('(\d+)', expand=False))
Index(['12', '10', '11', '15', '5', '6', '11', '12'], dtype='object')
Cast to integer
s:
print (df.index.str.extract('(\d+)', expand=False).astype(int))
Int64Index([12, 10, 11, 15, 5, 6, 11, 12], dtype='int64')
Get positions of sorted values by argsort:
print (df.index.str.extract('(\d+)', expand=False).astype(int).argsort())
[4 5 1 2 6 0 7 3]
Last select values by positions by iloc
:
print (df.iloc[df.index.str.extract('(\d+)', expand=False).astype(int).argsort()])
0
a5 5
a6 6
a10 2
a11 3
b11 7
a12 1
b12 8
a15 4