Сортировать по индексу и столбцу - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь отсортировать по индексу и столбцу, но безрезультатно.

Частичный набор данных

            ID         Element  Data_Value
Date            
2005-01-01  USW00004848 TMIN    0
2005-01-01  USC00207320 TMAX    150
2005-01-01  USC00207320 TMIN    -11
2005-01-01  USW00014833 TMIN    -44
2005-01-01  USW00014833 TMAX    33

индексный столбец

DatetimeIndex(['2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01', '2005-01-01',
               ...
               '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',
               '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',
               '2015-12-31', '2015-12-31'],
              dtype='datetime64[ns]', name='Date', length=165002, freq=None)

Моя попытка

df2 = df2.rename_axis(df2.index).sort_values(by = [df2.index, 'ID'], ascending = [False, True])

Вывод сверху: ValueError: Длина новых имен должна быть 1, получена 165002

df2 = df2.rename_axis("Date").sort_values(by = ["Date", "ID"], ascending = [False, True])

Вывод сверху: KeyError: 'Дата'

df2 = df2.sort_values(by = [df2.index, 'ID'], ascending = [False, True]) 

Выход сверху: KeyError: "DatetimeIndex (['2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01', \ n '2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01', \ n '2005-01-01', '2005-01-01', \ n ... \ n '2015-12-31', '2015-12-31','2015-12-31', '2015-12-31', \ n '2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31',\ n '2015-12-31', '2015-12-31'], \ n dtype = 'datetime64 [ns]', name = 'Date', длина = 165002, freq = None) нет в индексе "

df2 = df2.sort_values(by = ["Date", "ID"], ascending = [False, True])

Вывод сверху: KeyError: 'Date'

df2 = df2.sort_values(by = [df2.index.Date, 'ID'], ascending = [False, True]) 

Вывод сверху: AttributeError: у объекта «DatetimeIndex» нет атрибута «Date»

1 Ответ

1 голос
/ 10 октября 2019

В последней версии панд 0.23 + это работает хорошо:

print (df2.index)
DatetimeIndex(['2005-01-01', '2005-01-01', '2005-01-01', '2005-01-01',
               '2005-01-01'],
              dtype='datetime64[ns]', name='Date', freq=None)


df2 = df2.sort_values(by = ["Date", "ID"], ascending = [False, True])
print (df2)
                     ID Element  Data_Value
Date                                       
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207320    TMIN         -11
2005-01-01  USW00004848    TMIN           0
2005-01-01  USW00014833    TMIN         -44
2005-01-01  USW00014833    TMAX          33

Другое решение, работающее также в некоторых версиях старых панд, - преобразование DatetimeIndex в столбец первым, сортировка и обратное преобразование:

df2 = (df2.reset_index()
          .sort_values(by = ["Date", "ID"], ascending = [False, True])
          .set_index('Date'))

Спасибо @Alexander за альтернативу:

df2 = (df.set_index('ID', append=True)
         .sort_index(ascending=[False, True])
         .reset_index('ID'))

print (df2)
                     ID Element  Data_Value
Date                                       
2005-01-01  USC00207320    TMAX         150
2005-01-01  USC00207320    TMIN         -11
2005-01-01  USW00004848    TMIN           0
2005-01-01  USW00014833    TMIN         -44
2005-01-01  USW00014833    TMAX          33
...