Внешний индекс по возрастанию, внутренний индекс по убыванию в многоиндексных панд

#python #pandas

#python #pandas

Вопрос:

У меня есть многоиндексный фрейм данных, который я должен был sort_index.

Для внешнего индекса я хочу, чтобы он был в порядке возрастания, а для моего второго индекса я хочу, чтобы он был в порядке убывания.

Я пытался

df — это имя моего фрейма данных

 df.sort_index(level="outer")
df.sort_index(level="inner", ascending=False)
  

Для каждого внешнего индекса существует 20 внутренних индексов.

Комментарии:

1. Пожалуйста, добавьте определение df , чтобы пример был воспроизводимым.

Ответ №1:

Сначала давайте создадим воспроизводимый пример.

 In [1]: import numpy as np
   ...: import pandas as pd
   ...: np.random.seed(1)
   ...: index = pd.MultiIndex.from_product([[1, 2, 3], [1, 2, 3, 4]], names=['outer', 'inner'])
   ...: inds = list(range(len(index)))
   ...: np.random.shuffle(inds)
   ...: index = index[inds]
   ...: data = np.arange(len(index))
   ...: df = pd.DataFrame(index=index, data=data, columns=['A'])
   ...: df
Out[1]: 
              A
outer inner    
1     3       0
      4       1
2     1       2
3     3       3
1     2       4
2     3       5
1     1       6
2     4       7
3     4       8
      2       9
      1      10
2     2      11
  

Итак, pd.DataFrame.sort_levels не позволяет нам сортировать уровни в разных порядках одновременно, но мы можем сортировать их по частям и объединять результаты вместе.

 In [2]: (df
   ...:  .sort_index(level='outer', sort_remaining=False)
   ...:  .groupby(level='outer').apply(lambda df: df.sort_index(level='inner', ascending=False))
   ...:  .reset_index(level=0, drop=True)
   ...: )
Out[2]: 
              A
outer inner    
1     4       1
      3       0
      2       4
      1       6
2     4       7
      3       5
      2      11
      1       2
3     4       8
      3       3
      2       9
      1      10
  

Хотя, поскольку вы не описываете свои данные, я не знаю, возможно ли это в вашем случае, с числовыми значениями внутреннего индекса вы можете достичь желаемого, умножив на -1, отсортировав оба индекса одновременно, а затем снова умножив на -1.