使用DataFrame(pandas为pd,numpy为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明智的聚合:
In [42]: test_g.aggregate(np.median)
Out[42]:
      A     B
C
1   7.0   7.0
2  11.5  11.5

(虽然使用groupby.median方法似乎会产生预期的按列结果)

我希望解决以下问题:
  • 这种结果的原因/机制是什么?
  • 如果确认此行为,它将如何影响建议的汇总分组“最佳实践”?其他聚合功能可以这样工作吗?
  • 最佳答案

    原因很可笑。也许有些 Pandas 专家会想鸣叫,但这归结为numpy和 Pandas 之间的乒乓球。请注意该文档说:



    首先是2D(array_like),第二种方法归结为将1D array_likes传递给您提供的函数。

    这意味着聚合首先将2D系列传递进来。在第一种情况(np.mean)中,numpy知道数组具有.mean属性,因此它会一直执行此操作。但是,它使用axis=None(numpy的默认值)来调用它。这使Pandas抛出异常(它希望轴为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如何正确处理它。总的来说,我想知道 Pandas 是否至少不应该发出警告,毕竟将结果广播到两列几乎永远是不想要的。

    关于python - 使用numpy.median与其他功能汇总 Pandas groupby对象的结果不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12651618/

    10-10 04:01