微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

numpy – 使用两个聚合函数时Pandas交叉表重复计算?

我不确定这是我做错了什么或者不理解,或者它是否可能是pandas交叉表或numpy size函数中的错误.

我正在使用pandas示例here中的简单数据框

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

使用margin = 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.size函数会得到相同的结果:

>>> crosstab(rows=[df['A'],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允许您传递多个聚合函数以获得一个交叉表中的计数和均值.但是当我这样做时,foo和bar的大小计数都是之前调用的两倍,但整体总数保持正确.

>>> crosstab(rows=[df['A'],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

在这里错过了什么吗?为什么这两种情况的表现不同?

解决方法

好的,我已经知道它在做什么了.

在挖掘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’的计数,那么你可能预期的两倍

也许其他人可以告诉我们这是否是预期的.我仍然对源代码的一部分感到困惑.如果我弄清楚的话,我会编辑.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐