使用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/