Подтвердить что ты не робот

Сортировка серии панд

Я пытаюсь понять, как правильно сортировать Серии, сгенерированные в результате групповой агрегации.

Я генерирую агрегацию моего DataFrame следующим образом:

means = df.testColumn.groupby(df.testCategory).mean()

Это приводит к серии. Я сейчас пытаюсь отсортировать это по значению, но получаю ошибку:

means.sort()
...
-> Exception: This Series is a view of some other array, to sort in-place you must create a copy

Затем я пытаюсь создать копию:

meansCopy = Series(means)
meansCopy.sort()
-> Exception: This Series is a view of some other array, to sort in-place you must create a copy

Как я могу заставить этот вид работать?

4b9b3361

Ответ 1

Используйте sort_values, то есть means = means.sort_values(). [Панды v0. 17+]


(Очень старый ответ, до v0.17/2015)

Панды использовали метод order(): means = means.order().

Ответ 2

1) Используйте Series.sort_values()

# Setup.
np.random.seed(0)
df = pd.DataFrame({'A': list('aaabbbbccddd'), 'B': np.random.choice(5, 12)})
ser = df.groupby('A')['B'].mean()
ser

A
a    2.333333
b    2.500000
c    3.000000
d    1.333333
Name: B, dtype: float64

ser.sort_values()

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

1b) Сортировка в порядке убывания: sort_values(ascending=False)


2) Вы также можете позвонить в Series.argsort() и выполнить повторную индексацию с помощью __getitem__/Series.iloc:

ser[ser.argsort()]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

ser.iloc[ser.argsort()]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

3) Аналогично, numpy.argsort() (должно быть немного быстрее):

ser[np.argsort(ser)]
# ser[np.argsort(ser.values)]

A
d    1.333333
a    2.333333
b    2.500000
c    3.000000
Name: B, dtype: float64

3b) Чтобы отсортировать в порядке убывания, отмените аргумент:

ser[(-ser).argsort()]

A
c    3.000000
b    2.500000
a    2.333333
d    1.333333
Name: B, dtype: float64

Процесс аналогичен другим аналогичным методам.


4) Если вас интересуют только значения (а не индекс), используйте np.sort:

np.sort(ser)
# array([1.33333333, 2.33333333, 2.5       , 3.        ])

5) Как примечание, сортировка на месте (вызов .sort() на ser.values) возможна, но не рекомендуется:

ser.values.sort() будет сортировать значения ряда на месте, но не будет изменять индекс, поэтому технически это неверно.


[Старые методы до v0.17/2015: order, sort, sortUp, sortDown устарели]