2012-10-12 392 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的大熊貓:與aggfunc透視表=計數唯一不同

如何獲取數據透視表中有一個數據幀列的唯一值的計數另外兩列?
有沒有aggfunc數獨特?我應該使用np.bincount()嗎?

注意:我知道'系列'values_counts()但是我需要一個數據透視表。


編輯:輸出應該是:

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

您可以發表我已經提供了一些詳細的例子和替代的辦法在這你要 – root

+0

輸出[** Q&A **](https://stackoverflow.com/q/47152691/2336654) – piRSquared

回答

47

你的意思是這樣的?

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 

注意,使用len假設你沒有NA在你的數據幀。否則,您可以執行x.value_counts().count()len(x.dropna().unique())

+0

謝謝!這正是我想要的。 – dmi

+6

只需要用更新的熊貓解決方案進行更新,'aggfunc = pd.Series.nunique'就可以解決問題,並且應該更具性能。 – hume

1

您可以爲每個不同的值X構造一個數據透視表。在這種情況下,

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

將爲每個值X構造一個數據透視表。您可能需要使用xvalue索引ptable。有了這個代碼,我得到(爲X1

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

謝謝。但是,我不計算每個不同X值的出現次數,我計算了Y和Z在X中的不同值的數量。 – dmi

8

我認爲這將更加完美:

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

這確實是沒有模糊lambda所需的。 – Alper