2016-01-04 4 views
3

Я создал Dataframe с мультииндексным с помощью другого Dataframe:Сортировать панда мультииндексного

arrays = [df['bus_uid'], df['bus_type'], df['type'], 
      df['obj_uid'], df['datetime']] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['bus_uid', 'bus_type', 'type', 
               'obj_uid', 'datetime']) 
multindex_df = pd.DataFrame(df['val'].values, index=index) 

Это работало отлично, как описано в документации http://pandas.pydata.org/pandas-docs/stable/advanced.html.

В документации также говорится, что метки должны быть отсортированы для правильной работы функций индексирования и нарезки в разделе «Необходимость сортировки с помощью MultiIndex».

Но как-то

multindexed_df.sort_index(level=0) 

или

multindexed_df.sort_index(level='bus_uid') 

больше не работает и бросает TypeError: sort_index() получил неожиданный аргумент ключевое слово 'уровень'.

Подняв информацию об объекте на sort_index() это выглядит как «на» мой новый друг вместо «уровней»:

by:object 
    Column name(s) in frame. Accepts a column name or a list for a nested sort. A tuple will be interpreted as the levels of a multi-index. 

Мой вопрос заключается в следующем: Как я могу сортировать мой мультииндексных так что все функции (нарезка и т. д.) работают правильно?

ответ

4

Ответ зависит от версии панды, с которой вы работаете. С последних панд (> = 0.17.0), вы действительно можете использовать level ключевое слово, чтобы указать, для сортировки, какой уровень мультииндексом:

df = df.sort_index(level=0) 

Но, если у вас есть старых панд (< 0.17.0), это ключевое слово level пока не доступен, но вы можете использовать sortlevel метод:

df = df.sortlevel(level=0) 

но учтите, что если вы хотите сортировать все уровни, йо у не нужно указать level ключевое слово, и вы можете просто сделать:

df = df.sort_index() 

Это будет работать как для последних и более ранних версий панд.


Для резюме этих изменений в сортировочный API см http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#changes-to-sorting-api

+0

Моя ошибка! Я работал над версией 0.16.2 и теперь обновлен до 0.17.1. Так что просто применять * multindex_df.sort_index (inplace = True) * достаточно, чтобы получить все функциональные возможности? Спасибо! –

+0

Нарезка из упорядоченного индекса теперь выдает ошибку: 1. «idx = pd.IndexSlice» 2. «subset = multindex_df.loc [idx [['el: DE22C'], ['el'], ['input' ],:,:]] «приносит» «KeyError:« MultiIndex Slicing требует, чтобы индекс был полностью lexsorted tuple len (5), глубина lexsort (0) »« –

+0

Моя ошибка снова. Я забыл отсортировать индекс после воссоздания;) Спасибо вам большое! –

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