2013-06-21 71 views
4

我不知道這是我做錯了還是不明白,或者它可能是熊貓交叉表或numpy大小函數中的錯誤。當使用兩個聚合函數時,熊貓交叉表的雙重計數?

我用一個簡單的數據幀從大熊貓的例子here

>>> df = DataFrame({'A': ['one', 'one', 'two', 'three'] * 6, 'B': ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D': np.random.randn(24), 'E': np.random.randn(24)}) 

做與利潤率的簡單交叉表= True,以得到總額按預期工作:

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True) 
C  bar foo All 
A  B    
one A 2 2 4 
     B 2 2 4 
     C 2 2 4 
three A 2 0 2 
     B 0 2 2 
     C 2 0 2 
two A 0 2 2 
     B 2 0 2 
     C 0 2 2 
All  12 12 24 

使用NP。大小功能直接給出了相同的結果:

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True, aggfunc=[np.size]) 
C  bar foo All 
A  B    
one A 2 2 4 
     B 2 2 4 
     C 2 2 4 
three A 2 0 2 
     B 0 2 2 
     C 2 0 2 
two A 0 2 2 
     B 2 0 2 
     C 0 2 2 
All  12 12 24 

Pandas允許你pa ss在多個聚合函數中獲得計數和平均值在一個交叉表中。然而,當我這樣做時,foo和bar的尺寸都是前一次調用的兩倍,但整體總數保持正確。

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True, aggfunc=[np.size, np.mean], values=df['D']) 
     size    mean      
C   bar foo All  bar  foo  All 
A  B            
one A  2 2 4 0.245998 0.076366 0.161182 
     B  2 2 4 -0.739757 0.137780 -0.300988 
     C  2 2 4 -1.555759 -1.446554 -1.501157 
three A  2 NaN 2 1.216109  NaN 1.216109 
     B NaN 2 2  NaN 0.255482 0.255482 
     C  2 NaN 2 0.732448  NaN 0.732448 
two A NaN 2 2  NaN -0.273747 -0.273747 
     B  2 NaN 2 -0.001649  NaN -0.001649 
     C NaN 2 2  NaN 0.685422 0.685422 
All  24 24 24 -0.017102 -0.094208 -0.055655 

我在這裏錯過了什麼嗎?爲什麼在這兩種情況下這種行爲有所不同?

+0

這可能與將兩個函數傳遞給'aggfunc'有關。做'pd.crosstab(rows = [df ['A'],df ['B']],cols = [df ['C']],margin = True,aggfu nc = np.size,values = df ['D'])'也會在邊距中產生加倍的計數。 – TomAugspurger

+0

是的,它似乎是'values = df ['D']'這是造成倍增... – brandon

回答

1

好吧我已經知道它在做什麼。

通過源代碼中pandas/pandas/tools/pivot.py挖掘後,它涉及到的發言

row_margin = data[cols + values].groupby(cols).agg(aggfunc) 

這裏COLS爲df [ 'C']和值爲df [ 'd']。我們將這兩個東西按cols分組,然後應用聚合函數,在這種情況下是np.size。每一行看起來像

In [158]: data[cols + values].groupby(cols).nth(0) 
Out[158]: 
    __dummy__ 
C    
bar -1.823026 
foo 0.465117 

,當我們呼籲np.size(),我們當然得2總和所有這些2的多達拿到保證金,我們結了24次,如果你只是想你可能預期D'

的計數也許別人可以告訴我們這是否是預期的。我仍然對源代碼的一部分感到困惑。我會編輯,如果我找出更多。

+0

有可能有潛伏在那裏的錯誤,請報告GitHub,如果是的話 –

+0

謝謝韋斯,湯姆 - 讓我知道你是否希望我在github中記錄這個,或者如果你想添加它與你的測試結果。 – brandon

+0

@Brandon,如果你願意的話,你可以繼續並開啓一個問題。今天早上我會看看它。 – TomAugspurger