Как выбрать верхние k строк кадра данных полярностей Python для каждой группы?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как выбрать верхние k строк кадра данных полярностей Python для каждой группы?

Сообщение Anonymous »

Кадр данных Polars имеет метод top_k, который можно использовать для выбора строк, содержащих k наибольших значений, при сортировке по столбцу. Например, следующий код выбирает две строки с самой большой и второй по величине записью в столбце val:

Код: Выделить всё

df = pl.DataFrame({'grp':['a','a','a','b','b','b'], 'val':[1,2,3,10,20,30], 'etc':[0,1,2,3,4,5]})

grp val etc
str i64 i64
"a" 1   0
"a" 2   1
"a" 3   2
"b" 10  3
"b" 20  4
"b" 30  5

df.top_k(2, by='val')

grp val etc
str i64 i64
"b" 30  5
"b" 20  4
Мой вопрос: как мне получить строки с верхними значениями k для каждой группы? В частности, мне нужна вся строка, а не только значение в столбце val. Я хочу сделать что-то подобное, но это не работает в полярах, потому что в полярах GroupBy нет метода top_k:

Код: Выделить всё

df.groupby('grp').top_k(2, by='val') # doesnt work in polars

grp val etc
str i64 i64
"b" 30  5
"b" 20  4
"a" 3   2
"a" 2   1
Мне удалось придумать два способа: один с использованием Map_groups и другой с использованием сортировки. Оба из них нежелательны по соображениям производительности. Map_groups обычно не рекомендуется, поскольку он почти всегда значительно медленнее. Опция сортировки также нежелательна, поскольку для получения верхних k элементов используется более быстрый алгоритм, чем для сортировки (для маленьких k и больших n это в основном O (n) против O (n log n)). Поэтому, хотя приведенное ниже работает, я ищу другие подходы. Есть ли способ напрямую использовать метод top_k с группировкой поляров? Это было бы мое идеальное решение.

Код: Выделить всё

# works, but at expense of using map_groups method
df.group_by('grp').map_groups(lambda df: df.top_k(2, by='val'))

grp val etc
str i64 i64
"b" 30  5
"b" 20  4
"a" 3   2
"a" 2   1

Код: Выделить всё

# works, but at expense of sorting entire groups
df.group_by('grp').agg(pl.all().sort_by('val', descending=True).head(2)).explode('val','etc')

grp val etc
str i64 i64
"a" 3   2
"a" 2   1
"b" 30  5
"b" 20  4
  • Код: Выделить всё

    df.group_by('grp').top_k(2, by='val')
    , который не работает в полярах.
  • Код: Выделить всё

    df.group_by('grp').map_groups(lambda df: df.top_k(2, by='val'))
    , который работает за счет использования карт_групп
  • Код: Выделить всё

    df.group_by('grp').agg(pl.all().sort_by('val', descending=True).head(2)).explode('val','etc')
    , который работает за счет сортировки


Подробнее здесь: https://stackoverflow.com/questions/765 ... each-group
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»