ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用numpy.median与其他函数聚合pandas groupby对象的结果不一致

2019-08-26 04:59:51  阅读:292  来源: 互联网

标签:python pandas numpy aggregate


使用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如何正确处理它.一般来说,我想知道大熊猫是否至少不应该发出警告,毕竟将结果广播到两个列应该几乎不是想要的.

标签:python,pandas,numpy,aggregate
来源: https://codeday.me/bug/20190826/1726459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有