#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.