Скажем, у меня есть DataFrame вроде:
+------------+-----------+-----+
| feed|artist |count|
+------------+-----------+-----+
| y| Kanye West| 9|
| y| Radiohead| 6|
| y| Zero 7| 3|
| y| Puts Marie| 1|
| gwas| Drax| 7|
| gwas| Calibre| 4|
| gwas| Aphex Twin| 1|
| gwas| Jay Z| 1|
| x| DJ Krush| 2|
| x| Titeknots| 1|
+------------+-----------+-----+
Я хочу добавить новый столбец, который разбивает строки на сегменты N
строк для каждого раздела (feed
).
Мне кажется, что это инверсия NTILE. NTILE позволяет вам выбрать количество блоков, но вместо этого я хочу выбрать размер блока.
Вот желаемый результат. Обратите внимание, как каждый feed
разбивается на группы по N = 2
, включая ленту x
, в которой есть только один фрагмент из 2
строк. ( Редактировать: каждый раздел упорядочен по count
, поэтому группа 1
в каждом разделе будет представлять собой строки с наибольшим значением для count
)
+------------+-----------+-----+-----+
| feed|artist |count|group|
+------------+-----------+-----+-----+
| y| Kanye West| 1| 9|
| y| Radiohead| 1| 6|
| y| Zero 7| 1| 3|
| y| Puts Marie| 1| 1|
| gwas| Drax| 7| 7|
| gwas| Calibre| 1| 4|
| gwas| Aphex Twin| 1| 1|
| gwas| Jay Z| 8| 1|
| x| DJ Krush| 2| 2|
| x| Titeknots| 1| 1|
+------------+-----------+-----+-----+
Как Бонус, я хотел бы, чтобы каждое ведро было разного размера. Например, List(2, 2, 4, 10, 10, -1)
будет означать, что в первом сегменте 2
строк, во втором 2
строк, в третьем 4
строк и т. Д. c., А в последнем блоке (-1
) содержится остаток .
РЕДАКТИРОВАТЬ
(Еще один полезный вариант)
При реализации ответов я понял, что есть еще один вариант, который я бы предпочел:
Добавление столбца в DataFrame, который разбивает его строки на группы по N, не зная размера DataFrame.
Пример:
Если N = 100
и DataFrame имеет 800
строк, он разбивает его на 8
сегментов по 100. Если DataFrame имеет 950
строк, он разбивает его на 9
сегментов по 100 и 1
сегментов по 50. Он должен не требуется сканирование / вызов .count()
.
Примерные кадры данных аналогичны приведенным выше.
(meta: мне задать новый вопрос для этого варианта? Я чувствую, что «NTILE с фиксированным размером сегмента» - более элегантная проблема, и, вероятно, более распространенная, чем моя или исходный вариант использования)