2016-03-06 20 views
5

Pandalar grup çalışması sonucunda filtreyi gerçekleştirirken, bir veri çerçevesi döndürür. Ama daha fazla grup hesaplaması yapmak istediğimi varsayarsak, tekrar gruplama çağrısı yapmalıyım. Bunu yapmanın daha aptalca bir yolu var mı?Pandas GroupBy nesnesini nasıl filtreleyebilir ve GroupBy nesnesini nasıl geri alabilirim?

DÜZENLEME:

ben neden bahsettiğimi göstermek için:

Biz utanmadan Pandalar dokümanlardan bir oyuncak dataframe çalmak ve grup:

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

Bu GroupBy döndürür üzerinde yineleyebileceğimiz, grup-bilge operasyonlarını vb. gerçekleştirebileceğimiz nesne. Ama eğer biz filtre yaparsak:

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

Bir veri aralığına geri dönüyoruz. Filtre uygulanmış grupları elde etmek için filtrelenmiş grupları elde etmek yerine, yalnızca orijinal satırlar yerine, güzel bir deyim var mı?

+1

Lütfen neden bahsettiğinize bir örnek verin. – BrenBarn

+1

Bu iyi bir queston olduğunu düşünüyorum, SQL ile groupby birleştirebilirsiniz ve kullanıcı olarak SUM (like) GROUP BY kullanıcı HAVING toplam (seviyor)> 10 'olarak gruplandırılırken, pandalar yapmak zorunda kalacaksınız df. groupby ('kullanıcı'). filter (lambda x: len (x)> 10) .groupby ('user'). likes.sum() '; belki de cevap, 'groupby' içinde bir filter anahtar kelimesi veya' filter'de 'as_index' anahtar kelimesi eklemek olabilir mi? – maxymoo

+0

@BrenBarn: örnek eklendi. –

cevap

1

bu satırları kaldırmak için daha sonra dropna süzülmüş gruplar için None dönen bir filtre ve bir agrega, senin filtreyi birleştirmek ve bir üçlü ifapply içeride de kullanılarak toplanır olacaktır aklınıza gelebilecek en iyi yolu, birleştirmek ve isterseniz nihai sonuçtan dan:

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

, tekrar bir araya onlara katılmaya demek, bir jeneratör anlama kullanabilirsiniz

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

Nihayetinde groupby.filter'un groupby nesnesini döndürme seçeneğinin olması daha iyi olacağını düşünüyorum.

+0

Gerçek grupları geri almak istiyor, toplamlarını değil. – BrenBarn