2015-07-27 16 views
5

ID ile gruplamak istediğim bazı DataFrame'im var, e. g .:Pandalar Groupy sadece ilk N Grubunu al

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 

oluşturur:

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] 

ben kolayca kimliğiyle grubu: nasıl nesneler tarafından grup sadece ilk N dönebilirsiniz

grouped = df.groupby("item_id") 

Ama? Örneğin. Sadece ilk 3 benzersiz item_id'i istiyorum.

+0

Önce df filtrelemek daha kolay olmaz mıydı? 'Df [df [] 'ITEM_ID' isin (df [ 'ITEM_ID'] benzersiz() [. 3]).]. GroupBy '('ITEM_ID')? – EdChum

+0

@firelynx Katılıyorum. Bu sonucu bulamadım –

cevap

7

list(grouped)'u kullanmanın bir yolu vardır.

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

Teşekkür ederim, bu iyi bir fikir. Bazı kısıtlamalar nedeniyle sonunda rastgele bir sorgu kullanılır. –

1

bir yöntemi listeden üst 3 benzersiz öğeleri almak için Counter kullanan öğelere dayanarak DataFrame filtrelemek ve sonra bu süzülmüş DataFrame bir GroupBy işlemi gerçekleştirmek etmektir.

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

Teşekkürler, bu iyi bir fikir. Bazı kısıtlamalar nedeniyle sonunda rastgele bir sorgu kullanılır. –

İlgili konular