2012-10-12 20 views
29
df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']}) 

    X Y Z 
0 X1 Y2 Z3 
1 X1 Y1 Z1 
2 X1 Y1 Z1 
3 X1 Y1 Z2 

g=df2.groupby('X') 

pd.pivot_table(g, values='X', rows='Y', cols='Z', margins=False, aggfunc='count') 

Traceback (most recent call last): ... AttributeError: 'Index' object has no attribute 'index'Python Pandalar: farklı

nasıl diğer iki sütunlar için bir DataFrame sütunun benzersiz değerlerin sayılarıyla olan Pivot Tablo alırım benzersiz aggfunc ile özet tablo = saymak?
Sayım için benzersiz aggfunc var mı? np.bincount() kullanmalı mıyım?

NB. 'Series' values_counts()'un farkındayım, ancak bir pivot tabloya ihtiyacım var.


DÜZENLEME: Çıkış şöyle olacaktır:

Z Z1 Z2 Z3 
Y    
Y1 1 1 NaN 
Y2 NaN NaN 1 
+0

Bu davada ayrıntılı örnekler ve alternatif yaklaşımlar birkaç sağladık Eğer – root

+0

istediğiniz çıktıyı gönderebilir [** Soru & Cevap **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared

cevap

47

Böyle bir şey ifade ediyor mu? len kullanarak size DataFrame içinde NA s yok varsayar

In [39]: df2.pivot_table(values='X', rows='Y', cols='Z', 
         aggfunc=lambda x: len(x.unique())) 
Out[39]: 
Z Z1 Z2 Z3 
Y    
Y1 1 1 NaN 
Y2 NaN NaN 1 

Not. Aksi halde x.value_counts().count() veya len(x.dropna().unique())'u yapabilirsiniz.

+0

Teşekkür ederiz! Bu tam olarak istediğimi yapar. – dmi

+6

Sadece bunu daha yeni bir panda çözümü ile güncellemek için 'aggfunc = pd.Series.nunique' sorunu çözecek ve daha fazla performans gösterecektir. – hume

1

X'un her bir farklı değeri için bir pivot tablo oluşturabilirsiniz. Bu durumda,

for xval, xgroup in g: 
    ptable = pd.pivot_table(xgroup, rows='Y', cols='Z', 
     margins=False, aggfunc=numpy.size) 

X her bir değeri için bir pivot tablo inşa edecektir. xvalue'u kullanarak ptable'u dizine eklemek isteyebilirsiniz. Bu kod ile ben bu daha mükemmel olacak düşünüyorum

 X   
Z Z1 Z2 Z3 
Y    
Y1 2 1 NaN 
Y2 NaN NaN 1 
+1

Teşekkür ederim. Ancak, X'in her bir ayrı değerinin yinelenen sayısını saymıyorum, Y ve Z için X cinsinden ayrı değerlerin sayısını sayıyorum. – dmi

8

(X1 için) almak:

df2.pivot_table(values='X',rows=['Y','Z'],cols='X',aggfunc='count') 


       X1 X2 
Y Z  
Y1 Z1 1 1 
     Z2 1 NaN 
Y2 Z3 1 NaN 
+0

Bu, tam olarak bilinmeyen bir lambda olmadan gerekli olanı yapar. – Alper