2013-11-29 8 views
15

Возможно ли сортировать данные в формате pandas по значениям столбца, но также по индексу?Сортировка данных pandas как по значениям столбца, так и по индексу?

Если вы сортируете данные по кадрам pandas по значениям столбца, вы можете получить результирующий фрейм данных, отсортированный по столбцу, но, к сожалению, вы видите порядок индексации вашего фрейма данных в пределах одного и того же значения отсортированного столбца.

Итак, могу ли я отсортировать данные по столбцу, например столбец с именем count, но и отсортировать его по значению индекса? И также целесообразно сортировать столбец по убыванию, но в то же время сортировать индекс по возрастанию?

Я знаю, как сортировать несколько столбцов в dataframe, а также знаю, что я могу достичь того, что я прошу здесь, первым индексом и отсортировать его, а затем снова создать индекс. Но это более интуитивный и эффективный способ сделать это?

ответ

1

Для сортировки столбца по убыванию, сохраняя при этом индекс восходящий:

import pandas as pd 
df = pd.DataFrame(index=range(5), data={'c': [4,2,2,4,2]}) 
df.index = df.index[::-1] 
print df.sort(column='c', ascending=False) 

Выход:

c 
1 4 
4 4 
0 2 
2 2 
3 2 
+2

Спасибо. Но тогда это приводит к уничтожению индекса, который мне может не понравиться в некоторых случаях и, следовательно, по-прежнему предпочитает 'reset_index()' ... Спасибо за ваш ответ. – Blaszard

+0

Что вы подразумеваете под «разрушением индекса»? – cyborg

+0

Это уничтожит многоязычные. Вы можете попробовать это на одном из примеров multiindex в [docs] (http://pandas.pydata.org/pandas-docs/stable/advanced.html). Я бы опубликовал код, но он в основном не читается в качестве комментария. – Russ

1

Вы можете использовать комбинацию GroupBy и применять:

In [2]: df = pd.DataFrame({ 
      'transID': range(8), 
      'Location': ['New York','Chicago','New York','New York','Atlanta','Los Angeles', 
          'Chicago','Atlanta'], 
      'Sales': np.random.randint(0,10000,8)}).set_index('transID') 
In [3]: df 
Out[3]: 
     Location Sales 
transID 
0  New York 1082 
1  Chicago  1664 
2  New York 692 
3  New York 5669 
4  Atlanta  7715 
5  Los Angeles 987 
6  Chicago  4085 
7  Atlanta  2927 

In [4]: df.groupby('Location').apply(lambda d: d.sort()).reset_index('Location',drop=True) 
Out[4]: 
     Location Sales 
transID 
4  Atlanta  7715 
7  Atlanta  2927 
1  Chicago  1664 
6  Chicago  4085 
5  Los Angeles 987 
0  New York 1082 
2  New York 692 
3  New York 5669 

I drop 'Location' в последней строке, потому что groupby вставляет сгруппированные уровни в первые позиции в индекс. Сортировка и последующее удаление сохраняют отсортированный порядок.

13

Я бы рискнул, что самый простой способ - просто скопировать ваш индекс на столбец, а затем отсортировать его по обоим.

df['colFromIndex'] = df.index 
df = df.sort(['count', 'colFromIndex']) 

Я также предпочитаю, чтобы иметь возможность просто сделать что-то вроде df.sort(['count', 'index']), но, конечно, не работает.

+0

Странно, когда я пробовал это, он по-прежнему сортировал только столбец «count», а не столбец «colFromIndex» ... – durbachit

+2

Примечание: сортировка устарела. sort_values ​​теперь используется. – wwl

-9

я решить эту проблему следующим способом:

df.to_csv('df.csv', index = False) 
df = df.read_csv('df.csv') 
+1

не имеет ничего общего с? – clg4

-1

Я считаю, что первоначальный заказ от sort_values сохраняется даже тогда, когда sort_index применяется, так что это должно работать:

df.sort_values('count', ascending=False).sort_index(level=[index_level1, index_level2]) 
+0

Я пробовал это, это не тот случай, когда первоначальный заказ сохранен. – wesanyer

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