我不确定这是我做错了什么或者不理解,或者它是否可能是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] 举报,一经查实,本站将立刻删除。