Аномальное упорядочение имен столбцов в пандах - PullRequest
0 голосов
/ 08 мая 2018

Когда я экспортирую свой фрейм данных из pandas в электронную таблицу Excel, мой порядок столбцов выглядит так, как показано ниже, где «10 самых больших событий» считается следующим после «1 самого большого события», а не «2 самого большого события». Я хочу, чтобы он появился в числовом порядке. то есть «1 крупнейшее событие», «2 крупнейшее событие», «10 крупнейшее событие»

ID_1    Permit No.        ID_2       1 Largest Event    10 Largest Event    2 Largest Event
10220   To Be Permitted 0010001-24.1       4.0548                  0.822    3.9611

Почему это происходит? Это небольшая ошибка форматирования, но это может быть довольно неприятно.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

С natsort с reindex

from natsort import natsorted
l=['1 Largest Event','10 Largest Event','2 Largest Event']
natsorted(l)
Out[789]: ['1 Largest Event', '2 Largest Event', '10 Largest Event']
df=df.reindex(columns=natsorted(list(df)))
0 голосов
/ 08 мая 2018

Проблема в том, что ваши столбцы отсортированы как строки в лексикографическом порядке.

Так что нужна сортировка с пользовательской функцией по первому разделенному значению, преобразованному в 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...