Python 使用numpy.median与其他函数按对象聚合的结果不一致
使用数据帧(熊猫作为pd,numpy作为np): 按“C”对DF进行分组,并用np.mean(也包括总和、最小值、最大值)进行聚合,可在组内生成列式聚合:Python 使用numpy.median与其他函数按对象聚合的结果不一致,python,numpy,aggregate,pandas,Python,Numpy,Aggregate,Pandas,使用数据帧(熊猫作为pd,numpy作为np): 按“C”对DF进行分组,并用np.mean(也包括总和、最小值、最大值)进行聚合,可在组内生成列式聚合: 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 In [42]: test_g.aggregate(np.medi
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
In [42]: test_g.aggregate(np.median)
Out[42]:
A B
C
1 7.0 7.0
2 11.5 11.5
但是,使用np.MIDA进行聚合似乎会在组内生成数据帧聚合:
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
In [42]: test_g.aggregate(np.median)
Out[42]:
A B
C
1 7.0 7.0
2 11.5 11.5
(使用groupby.median
方法似乎可以产生预期的列式结果)
我希望解决以下问题:
我怀疑这是一个错误。。。所以 同时(如果你原谅双关语),你可以使用以下方法:
原因很有趣。也许一些熊猫专家会想插嘴,但归根结底,这是努比和熊猫之间的一场乒乓球。请注意,文档说明: 用于聚合组的函数。如果是函数,则必须 当传递给DataFrame或传递给DataFrame.apply时工作。如果 传递dict时,键必须是DataFrame列名 第一件事是2D(类似数组)第二种方法可以归结为1D array(类似数组)被传递给您提供的函数 这意味着聚合首先通过中的2D系列。在第一种情况下(
np.mean
),numpy知道数组有一个.mean
属性,所以它总是这样做,它称之为。但是,它使用axis=None调用它(默认为numpy)。这使得Pandas抛出一个异常(它希望axis为0或1,而不是无),并进入第二步,将其作为1D传递,这是万无一失的
但是,当您输入np.median
numpy数组时,它不具有.median
属性,因此它使用常规numpy机制,即展平数组(即,通常轴=无
)
解决方法是使用
测试聚合([np.median,np.median])
强制它始终采用第二条路径。或者什么也能起作用:test\u g.aggregate(np.median,axis=0)
将axis=0
传递到np.median
,从而告诉numpy如何正确处理它。总的来说,我想知道pandas是否至少不应该发出警告,毕竟,将结果广播到两个栏目几乎从来都不是我们想要的。另外,作为一种解决方法,请注意pandas有一些常用操作的快捷方法:
In [12]: test.groupby('C').mean()
Out[12]:
A B
C
1 11.50 2.5
2 38.25 6.5
In [13]: test.groupby('C').median()
Out[13]:
A B
C
1 11.5 2.5
2 34.0 6.5
对于sum、mean、median、max、min、first、last、std等,您可以直接调用该方法,而不必担心应用到数据帧,而是故障切换到GroupBy引擎中的每个列机制。从v 0.12 DataFrame开始。引入了median:
在V0.12之前,我认为该方法不存在。相反,您可以使用numpy。median
agg
只是聚合的简写,但是您总是强制它在单个列上工作,这可以解决问题。事实上,.agg似乎不起作用:In[6]:test_g.agg(np.median)Out[6]:a B C 1 7.0 7.0 2 11.5 11.5
While.agg([x])工作:In[7]:test_g.agg([np.median])Out[7]:A B median C 1 11.5 2.5 2 34.0 6.5
seberg的回答解释了我的想法。对不起,在评论中形成代码时遇到了令人尴尬的困难;)<代码>聚集([np.中值])
:)是。我只是想找出一个链接来传入axis=0
,这是正确的方法。谢谢,我怀疑问题是关于pandas-numpy接口和numpy的数组处理,检查了aggregate
docstring,但无法得出您所做的结论;)