Проблема в том, что ваши столбцы отсортированы как строки в лексикографическом порядке.
Так что нужна сортировка с пользовательской функцией по первому разделенному значению, преобразованному в int
s:
df = df[sorted(df.columns, key=lambda x: int(x.split()[0]))]
Sample
cols = ['1 Largest Event',
'10 Largest Event',
'2 Largest Event',
'3 Largest Event',
'4 Largest Event',
'5 Largest Event',
'6 Largest Event',
'7 Largest Event',
'8 Largest Event',
'9 Largest Event']
df = pd.DataFrame(0, columns=cols, index=[0])
print (df)
1 Largest Event 10 Largest Event 2 Largest Event 3 Largest Event \
0 0 0 0 0
4 Largest Event 5 Largest Event 6 Largest Event 7 Largest Event \
0 0 0 0 0
8 Largest Event 9 Largest Event
df = df[sorted(df.columns, key=lambda x: int(x.split()[0]))]
print (df)
1 Largest Event 2 Largest Event 3 Largest Event 4 Largest Event \
0 0 0 0 0
5 Largest Event 6 Largest Event 7 Largest Event 8 Largest Event \
0 0 0 0 0
9 Largest Event 10 Largest Event
0 0 0
EDIT:
Вы также можете отфильтровать последние 3 столбца для сортировки:
df = df[df.columns[:3].tolist() + sorted(df.columns[3:], key=lambda x: int(x.split()[0]))]
print (df)
ID_1 Permit No. ID_2 1 Largest Event 2 Largest Event \
0 10220 To Be Permitted 0010001-24.1 4.0548 3.9611
10 Largest Event
0 0.822