使用DataFrame(pandas as pd,numpy as np):
test = pd.DataFrame({'A' : [10,11,12,13,15,25,43,70],
'B' : [1,2,3,4,5,6,7,8],
'C' : [1,1,1,1,2,2,2,2]})
In [39]: test
Out[39]:
A B C
0 10 1 1
1 11 2 1
2 12 3 1
3 13 4 1
4 15 5 2
5 25 6 2
6 43 7 2
7 70 8 2
通过’C’对DF进行分组并与np.mean(也是sum,min,max)聚合在组内产生逐列聚合:
In [40]: test_g = test.groupby('C')
In [41]: test_g.aggregate(np.mean)
Out[41]:
A B
C
1 11.50 2.5
2 38.25 6.5
但是,看起来使用np.median进行聚合会在组内生成DataFrame-wise聚合:
In [42]: test_g.aggregate(np.median)
Out[42]:
A B
C
1 7.0 7.0
2 11.5 11.5
(虽然使用groupby.median方法似乎产生了预期的列式结果)
我希望解决以下问题:
>这种结果的原因/机制是什么?
>如果确认此行为,它如何影响聚合分组的推荐“最佳实践”?其他聚合函数可以这样工作吗?
解决方法:
原因很有趣.可能一些大熊猫专家想要进入,但它归结为numpy和pandas之间的乒乓球.请注意,文档说:
Function to use for aggregating groups. If a function, must either
work when passed a DataFrame or when passed to DataFrame.apply. If
pass a dict, the keys must be DataFrame column names
第一个是2D(array_like),第二个方法归结为1D array_likes被传递给你给出的函数.
这意味着聚合首先传递2D系列.在第一种情况下(np.mean),numpy知道数组具有.mean属性,因此它执行它总是调用它的方式.但是它用axis = None调用它(默认为numpy).这使得Pandas抛出一个Exception(它希望axis为0或1而且从不为None)并且它进入第二步,它将它作为1D传递并且是万无一失的.
但是,当你在np.median中给出numpy数组时,没有.median属性,所以它执行正常的numpy机制,即平整数组(即,通常是axis = None).
解决方法是使用test_g.aggregate([np.median,np.median])强制它始终采用第二条路径.或者也会起作用:test_g.aggregate(np.median,axis = 0)将axis = 0传递给np.median,从而告诉numpy如何正确处理它.一般来说,我想知道大熊猫是否至少不应该发出警告,毕竟将结果广播到两个列应该几乎不是想要的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。