2016-09-20 3 views
0

У меня есть следующие кадр данных панды, которые я хочу, чтобы отсортировать по «test_type»Python панды dataframe sort_values ​​не работает

test_type   tps   mtt  mem  cpu  90th 
0 sso_1000 205.263559 4139.031090 24.175933 34.817701 4897.4766 
1 sso_1500 201.127133 5740.741266 24.599400 34.634209 6864.9820 
2 sso_2000 203.204082 6610.437558 24.466267 34.831947 8005.9054 
3 sso_500 189.566836 2431.867002 23.559557 35.787484 2869.7670 

Мой код для загрузки dataframe и оно есть, то первая печать линия печатает кадр данных выше.

 df = pd.read_csv(file) #reads from a csv file 
     print df 
     df = df.sort_values(by=['test_type'], ascending=True) 
     print '\nAfter sort...' 
     print df 

После выполнения сортировки и печати содержимого фреймов кадр данных по-прежнему выглядит ниже.

Вывод программы:

After sort... 
    test_type   tps   mtt  mem  cpu  90th 
0 sso_1000 205.263559 4139.031090 24.175933 34.817701 4897.4766 
1 sso_1500 201.127133 5740.741266 24.599400 34.634209 6864.9820 
2 sso_2000 203.204082 6610.437558 24.466267 34.831947 8005.9054 
3 sso_500 189.566836 2431.867002 23.559557 35.787484 2869.7670 

Я ожидаю, строка 3 (тип теста: sso_500 строка), чтобы быть на вершине после сортировки. Может ли кто-нибудь помочь мне понять, почему он не работает так, как должен?

+4

Похоже, это сортировка по 'test_type', который является строкой, которая сортирует лексически. Я думаю, вам, вероятно, нужно разделить на '_' и zfill на 4" числовую "часть этого столбца. –

ответ

5

Предпочитаю, что вы пытаетесь сделать, сортировать по численному значению после sso_. Вы можете сделать это следующим образом:

import numpy as np 

df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values) 

Это

  1. разбивает строки на _

  2. преобразует то, что после этого символа к численному значению

  3. Находит индексы отсортированных в соответствии с численными значениями

  4. сортирует DataFrame по этим показателям

Пример

In [15]: df = pd.DataFrame({'test_type': ['sso_1000', 'sso_500']}) 

In [16]: df.sort_values(by=['test_type'], ascending=True) 
Out[16]: 
    test_type 
0 sso_1000 
1 sso_500 

In [17]: df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values)] 
Out[17]: 
    test_type 
1 sso_500 
0 sso_1000 
+0

Я только что проверил это, и вы правы. То, что я в конечном счете сделал, - это изменить строку в моей другой программе (генератор csv), которая делает это 500_sso вместо sso_500. Кажется, я решил свою проблему, я просто должен помнить об этом, чтобы генерировать мои строки типа теста. – jeffsia

+0

'500_sso' должно по-прежнему сортироваться после' 1500_sso'. –

3

В качестве альтернативы, вы можете также извлечь номера из test_type и сортировать их. Затем следуют reindexing DF согласно этим индексам.

df.reindex(df['test_type'].str.extract('(\d+)', expand=False) \ 
          .astype(int).sort_values().index).reset_index(drop=True) 

Image

Смежные вопросы