Pandas Groupy берет только первые N групп

У меня есть DataFrame, который я хочу сгруппировать по идентификатору, например. грамм.:

import pandas as pd
df = pd.DataFrame({'item_id': ['a', 'a', 'b', 'b', 'b', 'c', 'd'], 'user_id': [1,2,1,1,3,1,5]})
print df

Что генерирует:

  item_id  user_id
0       a        1
1       a        2
2       b        1
3       b        1
4       b        3
5       c        1
6       d        5

[7 rows x 2 columns]

Я могу легко сгруппировать по идентификатору:

grouped = df.groupby("item_id")

Но как я могу вернуть только первые N объектов group-by? напр. Мне нужны только первые 3 уникальных идентификатора item_id.


person Christian Sauer    schedule 27.07.2015    source источник
comment
Не проще ли сначала просто отфильтровать df? df[df['item_id'].isin(df['item_id'].unique()[:3])].groupby('item_id')?   -  person EdChum    schedule 27.07.2015
comment
@firelynx Я согласен. такого результата я не нашел   -  person Christian Sauer    schedule 27.07.2015
comment
Перебрать первые 3 группы.for n,(k,gg) in enumerate(list(g)[:3]), где g — экземпляр groupby.   -  person BSalita    schedule 10.05.2021


Ответы (2)


Вот один из способов использования list(grouped).

result = [g[1] for g in list(grouped)[:3]]

# 1st
result[0]

  item_id  user_id
0       a        1
1       a        2

# 2nd
result[1]

  item_id  user_id
2       b        1
3       b        1
4       b        3
person Jianxun Li    schedule 27.07.2015
comment
Спасибо, это хорошая идея. Из-за некоторых ограничений в конце использовался случайный запрос. - person Christian Sauer; 27.07.2015

Один из способов — использовать Counter, чтобы получить 3 лучших уникальных элемента из списка, отфильтровать ваш DataFrame на основе этих элементов, а затем выполнить операцию groupby для этого отфильтрованного DataFrame.

from collections import Counter

c = Counter(df.item_id)
most_common = [item for item, _ in c.most_common(3)]

>>> df[df.item_id.isin(most_common)].groupby('item_id').sum()
         user_id
item_id         
a              3
b              5
c              1
person Alexander    schedule 27.07.2015
comment
Спасибо, это хорошая идея. Из-за некоторых ограничений в конце использовался случайный запрос. - person Christian Sauer; 27.07.2015