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

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

使用数据帧(熊猫作为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.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,但无法得出您所做的结论;)