2016-03-06 44 views
5

Khi thực hiện bộ lọc trên kết quả của một hoạt động nhóm Pandas, nó trả về một khung dữ liệu. Nhưng giả sử rằng tôi muốn thực hiện các tính toán nhóm hơn nữa, tôi phải gọi lại nhóm một lần nữa, điều này dường như sắp xếp lại. Có cách nào khác để làm điều này không?Làm cách nào để lọc đối tượng Pandas GroupBy và lấy đối tượng GroupBy?

EDIT:

Để minh họa cho những gì tôi đang nói về:

Chúng tôi không biết xấu hổ ăn cắp một dataframe đồ chơi từ các tài liệu Pandas, và nhóm:

>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) 
>>> grouped = dff.groupby('B') 
>>> type(grouped) 
<class 'pandas.core.groupby.DataFrameGroupBy'> 

này trả về một groupby đối tượng mà chúng tôi có thể lặp lại, thực hiện các hoạt động theo nhóm, v.v. Nhưng nếu chúng tôi lọc:

>>> filtered = grouped.filter(lambda x: len(x) > 2) 
>>> type(filtered) 
<class 'pandas.core.frame.DataFrame'> 

Chúng tôi lấy lại một khung dữ liệu. Có một cách thành ngữ tốt đẹp để có được các nhóm được lọc trở lại, thay vì chỉ các hàng ban đầu thuộc về các nhóm được lọc không?

+1

Vui lòng cho ví dụ về những gì bạn đang nói đến. – BrenBarn

+1

Tôi nghĩ rằng đây là một queston tốt, trong SQL bạn có thể kết hợp groupby bởi và lọc như 'người dùng SELECT, SUM (thích) GROUP BY user HAVING sum (thích)> 10' trong khi trong gấu trúc bạn sẽ phải làm' df. bộ lọc nhóm ('người dùng') (lambda x: len (x)> 10) .groupby ('user'). likes.sum() '; có lẽ câu trả lời sẽ bao gồm một từ khóa lọc trong 'groupby' hoặc một từ khóa' as_index' trong 'filter'? – maxymoo

+0

@BrenBarn: đã thêm ví dụ. –

Trả lời

1

Nếu bạn muốn kết hợp một bộ lọc và tổng hợp, cách tốt nhất tôi có thể nghĩ sẽ kết hợp bộ lọc của bạn và tổng hợp sử dụng một ternary if bên apply, trở None cho các nhóm lọc, và sau đó dropna để loại bỏ các hàng từ kết quả cuối cùng của bạn:

grouped.apply(lambda x: x.sum() if len(x) > 2 else None).dropna() 

Nếu bạn đang muốn lặp qua các nhóm, nói tham gia cùng họ trở lại với nhau, bạn có thể sử dụng một sự hiểu biết phát

pd.concat(g for i,g in grouped if len(g)>2) 

Cuối cùng tôi nghĩ sẽ tốt hơn nếu groupby.filter có tùy chọn trả về một đối tượng nhóm.

+0

Ông muốn các nhóm thực tế trở lại, không phải tổng của họ. – BrenBarn

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