В Pandas как сортировать один уровень мультииндекса на основе значений столбца, сохраняя при этом группировку другого уровня

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

фактические данные включают в себя около 1 миллиона обзоров фильмов, и я пытаюсь проанализировать это на основе американских почтовых индексов, но чтобы проверить, как делать то, что я хочу, я использую гораздо меньший набор данных из 250 случайно сгенерированных рейтингов для 10 фильмов и вместо почтовых индексов я использую возрастные группы.

вот что у меня есть сейчас, это multiindexed класса DataFrame в панд с двумя уровнями, "группа" и "название"

                        rating
group       title   
            Alien       4.000000
            Argo        2.166667
Adults      Ben-Hur     3.666667
            Gandhi      3.200000
            ...         ...

            Alien       3.000000
            Argo        3.750000
Coeds       Ben-Hur     3.000000
            Gandhi      2.833333
            ...         ...

            Alien       2.500000
            Argo        2.750000
Kids        Ben-Hur     3.000000
            Gandhi      3.200000
            ...         ...

то, что я стремлюсь, это сортировать названия на основе их рейтинга в группе (и показывать только самые популярные 5 или около того названия в каждой группе)

Итак, что-то вроде этого (но я собираюсь показать только два названия в каждой группе):

                        rating
group       title   
            Alien       4.000000
Adults      Ben-Hur     3.666667

            Argo        3.750000
Coeds       Alien       3.000000

            Gandhi      3.200000
Kids        Ben-Hur     3.000000

кто-нибудь знает, как это сделать? Я пробовал sort_order, sort_index и т. д. и менял уровни, но они также смешивают группы. Так что тогда выглядит так:

                          rating
group         title 
Adults        Alien      4.000000
Coeds         Argo       3.750000
Adults        Ben-Hur    3.666667
Kids          Gandhi     3.666667
Coeds         Alien      3.000000
Kids          Ben-Hur    3.000000

Я вроде как ищу что-то вроде этого: сортировка нескольких индексов в панд, но вместо сортировки на основе другого уровня я хочу сортировать на основе значений. Как если бы этот человек хотел сортировать на основе своей колонки продаж.

спасибо!

1 ответов


вы ищете вроде:

In [11]: s = pd.Series([3, 1, 2], [[1, 1, 2], [1, 3, 1]])

In [12]: s.sort()

In [13]: s
Out[13]: 
1  3    1
2  1    2
1  1    3
dtype: int64

Примечание; это работает inplace (т. е. изменяет s), чтобы вернуть копию use ордер:

In [14]: s.order()
Out[14]: 
1  3    1
2  1    2
1  1    3
dtype: int64

Update: я понял, что вы на самом деле спрашивали, и я думаю, что это должен быть вариант в sortlevels, но пока я думаю, что вам нужно reset_index, groupby и применить:

In [21]: s.reset_index(name='s').groupby('level_0').apply(lambda s: s.sort('s')).set_index(['level_0', 'level_1'])['s']
Out[21]: 
level_0  level_1
1        3          1
         1          3
2        1          2
Name: 0, dtype: int64

Примечание: после этого вы можете установить имена уровней в [None, None].