2015-07-27 14 views
5

Mam niektóre DataFrame, które chcę grupować przez identyfikator, np. G .:Pandy Groupy biorą tylko pierwsze N ​​grup

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 

który generuje:

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] 

mogę łatwo grupa przez ID:

grouped = df.groupby("item_id") 

Ale jak mogę wrócić tylko grupa N-najpierw obiektów? E. g. Chcę tylko 3 pierwsze unikalne item_ids.

+0

Czy nie byłoby łatwiej odfiltrować najpierw df? 'df [df ['item_id']. isin (df ['item_id']. unique() [: 3])] groupby ('item_id')'? – EdChum

+0

@firelynx Zgadzam się. Nie znalazłem tego wyniku. –

Odpowiedz

7

Oto jeden ze sposobów używania numeru 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 
+0

Dziękuję, to dobry pomysł. Ze względu na pewne ograniczenia użyliśmy losowego zapytania na końcu. –

1

Jedną z metod jest użycie Counter uzyskać top 3 unikalne przedmioty z listy, filtrowanie DataFrame oparciu o te elementy, a następnie przeprowadzić operację GroupBy na tej przefiltrowanej 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 
+0

Dziękuję, to dobry pomysł. Ze względu na pewne ograniczenia użyliśmy losowego zapytania na końcu. –

Powiązane problemy