Лучшие N строк по группам с использованием данных на Python - PullRequest
0 голосов
/ 10 января 2019

Как правильно запросить первые N строк по группам в python datatable ?
Например, чтобы получить верхние 2 строки, имеющие наибольшее значение v3 по группе id2, id4, я бы сделал выражение панды следующим образом:

df.sort_values('v3', ascending=False).groupby(['id2','id4']).head(2)

в R с использованием data.table:

DT[order(-v3), head(v3, 2L), by=.(id2, id4)]

или в R, используя dplyr:

DF %>% arrange(desc(v3)) %>% group_by(id2, id4) %>% filter(row_number() <= 2L)

Пример данных и ожидаемого выхода с использованием панд:

import datatable as dt
dt = dt.Frame(id2=[1, 2, 1, 2, 1, 2], id4=[1, 1, 1, 1, 1, 1], v3=[1, 3, 2, 3, 3, 3])
df = dt.to_pandas()
df.sort_values('v3', ascending=False).groupby(['id2','id4']).head(2)
#   id2  id4  v3
#1    2    1   3
#3    2    1   3
#4    1    1   3
#2    1    1   2

1 Ответ

0 голосов
/ 30 января 2019

Начиная с datatable версии 0.8.0, это может быть достигнуто путем объединения группировки, сортировки и фильтрации:

from datatable import *
DT = Frame(id2=[1, 2, 1, 2, 1, 2], 
           id4=[1, 1, 1, 1, 1, 1], 
           v3=[1, 3, 2, 3, 3, 3])

DT[:2, :, by(f.id2, f.id4), sort(-f.v3)]

, который производит

     id2  id4  v3
---  ---  ---  --
 0     1    1   3
 1     1    1   2
 2     2    1   3
 3     2    1   3

[4 rows x 3 columns]

Пояснение:

  • by(f.id2, f.id4) группирует данные по столбцам "id2" и "id4";
  • команда sort(-f.v3) указывает datatable отсортировать записи по столбцу "v3" в порядке убывания. При наличии by() этот оператор будет применяться в каждой группе;
  • первый :2 выбирает 2 верхние строки, опять же в каждой группе;
  • второй : выбирает все столбцы. При необходимости это мог быть список столбцов или выражений, позволяющий выполнить некоторые операции с первыми 2 строками каждой группы.
...