2013-08-01 19 views
18

Her grupta kaç öğenin sayılacağını belirlemek için .size() öğesini bir grup sonucuyla kullanıyorum. Ben sonuç istiyorum Bir size() sütununa bir ad nasıl atanır?

elle yapılabilir, nasıl sütun adları dizisi düzenleme olmadan yeni sütun adının kaydedilmesine?

Teşekkür

Bu ben denedim budur:

grpd = df.groupby(['A','B']) 
grpd['size'] = grpd.size() 
grpd 

ve aldığım hata:

TypeError: 'DataFrameGroupBy' object does not support item assignment (on the second line)

+1

o pandalar altındaki her nesne üzerinde bir yerleşik yöntem, yani yalnızca getitem'' '' yoluyla değil, '' getattr'' aracılığıyla alınamadı çünkü size'', bir sütun için kötü bir seçim olduğunu '' dikkati çekiyor . – Meitham

cevap

12

df.groupby(...) sonucu bir DataFrame değildir. DataFrame'i geri almak için, her gruba bir işlev uygulamanız, bir grubun her öğesini dönüştürmeniz veya grupları filtrelemeniz gerekir.

Tüm orijinal verilerinizi (1) df içinde (1) içeren ve her grupta ne kadar veri olduğunu belirten bir DataFrame istediğiniz gibi görünüyor. Bu şeylerin farklı uzunlukları vardır, bu yüzden aynı DataFrame'e gitmeleri gerekiyorsa, boyutu her bir gruptaki her satır için gereksiz olarak listelemeniz gerekir.

df['size'] = df.groupby(['A','B']).transform(np.size) 

(Kenara: Eğer özlü örnek girişi ve beklenen sonuçlar gösterebilir eğer yararlı olur.) Sen transformsize ihtiyaç

+1

yay, dönüş! –

+0

Ben de neredeyse eşit olan bu bulduk verimlilik açısından sizin çözümü http://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object ile karşılaştırır nasıl emin (yeni bir dataframe yaratır), ancak -to-dataframe – d1337

+0

Çözümünüzün üzerinde daha çok bir oyuncak örneğinde iyi çalışır, ancak gerçek verilerde bir hata döndürülür http://pastebin.com/aCsMxCd5 – d1337

6

- df ait len aynıdır önce: Gerek olursa

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df['size'] = df.groupby(['A', 'B'])['A'].transform('size') 
print (df) 
    A B size 
0 x a  1 
1 x c  2 
2 x c  2 
3 y b  2 
4 y b  2 

df toplayarak belirlenen sütun adı - df ait len açıkçası dEĞİL aynı bir olduğunu s öncesi:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df = df.groupby(['A', 'B']).size().reset_index(name='Size') 
print (df) 
    A B Size 
0 x a  1 
1 x c  2 
2 y b  2 
12

DataFrameGroupBy ait .size() yerleşik yöntem aslında nesneleri grup boyutları ve bir DataFrame bir Serisi nesnesi döndürür. Eğer Sütun grupları tarafından endeksli grup boyutları vardır, özel bir adla bir DataFrame istiyorsanız, .to_frame() yöntemi kullanmak ve argüman olarak istenen sütun adı kullanabilirsiniz.

grpd = df.groupby(['A','B']).size().to_frame('size') 

Eğer gruplar tekrar sonunda .reset_index() ekleyebilir sütunları olmak isteseydim.

İlgili konular