2015-07-27 25 views
5

Tôi có một số DataFrame mà tôi muốn nhóm theo ID, e. G .:Pandas Groupy chỉ lấy N Nhóm đầu tiên

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 

nào tạo:

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] 

tôi có thể dễ dàng nhóm bởi id:

grouped = df.groupby("item_id") 

Nhưng làm thế nào tôi có thể trở lại chỉ có nhóm bằng cách đầu tiên N đối tượng? Ví dụ. Tôi chỉ muốn có 3 item_id duy nhất đầu tiên.

+0

Sẽ dễ dàng hơn khi chỉ lọc bộ lọc đầu tiên? 'df [df ['item_id']. isin (df ['item_id']. duy nhất() [: 3])]. groupby ('item_id')'? – EdChum

+0

@firelynx Tôi đồng ý. Tôi đã không tìm thấy kết quả đó –

Trả lời

7

Dưới đây là một cách sử dụng 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

Cảm ơn bạn, đó là một ý tưởng hay. Do một số ràng buộc, một truy vấn ngẫu nhiên đã được sử dụng cuối cùng. –

1

Một phương pháp là sử dụng Counter để có được 3 vật phẩm độc đáo hàng đầu từ danh sách, lọc DataFrame của bạn dựa trên những mặt hàng, và sau đó thực hiện một hoạt động groupby trên DataFrame lọc này.

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

Cảm ơn bạn, đó là một ý tưởng hay. Do một số ràng buộc, một truy vấn ngẫu nhiên đã được sử dụng cuối cùng. –

Các vấn đề liên quan