我不知道這是我做錯了還是不明白,或者它可能是熊貓交叉表或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
我在這裏錯過了什麼嗎?爲什麼在這兩種情況下這種行爲有所不同?
這可能與將兩個函數傳遞給'aggfunc'有關。做'pd.crosstab(rows = [df ['A'],df ['B']],cols = [df ['C']],margin = True,aggfu nc = np.size,values = df ['D'])'也會在邊距中產生加倍的計數。 – TomAugspurger
是的,它似乎是'values = df ['D']'這是造成倍增... – brandon