熊猫-DataFrame聚合行为异常

时间:2019-02-26 19:32:39

标签: pandas numpy dataframe aggregate series

Dataframe aggregate method passing list problemPandas fails to aggregate with a list of aggregation functions

有关

考虑此数据框

import pandas as pd
import numpy as np
df = pd.DataFrame(index=range(10))
df['a'] = [ 3 * x for x in range(10) ]
df['b'] = [ 1 -2 * x for x in range(10) ]

根据aggregate的{​​{3}},您应该能够使用dict指定要聚合的列,如下所示:

df.agg({'a' : 'mean'})

返回哪个

a    13.5

但是,如果您尝试使用这样的用户定义功能aggregate

def nok_mean(x):
    return np.mean(x)

df.agg({'a' : nok_mean})

它返回每一行而不是每一列的平均值

      a
0   0.0
1   3.0
2   6.0
3   9.0
4  12.0
5  15.0
6  18.0
7  21.0
8  24.0
9  27.0

为什么用户定义的函数返回的结果与用np.mean'mean'进行聚合的返回结果不同?

这正在使用pandas0.23.4numpy1.15.4python3.7.1

3 个答案:

答案 0 :(得分:3)

问题与将np.mean应用于系列有关。让我们看几个例子:

def nok_mean(x):
    return x.mean()

df.agg({'a': nok_mean})

a    13.5
dtype: float64

这可以按预期工作,因为您使用的是平均值的熊猫版本,可以将其应用于序列或数据框:

df['a'].agg(nok_mean)
df.apply(nok_mean)

让我们看看将np.mean应用于系列时会发生什么:

def nok_mean1(x):
    return np.mean(x)

df['a'].agg(nok_mean1)
df.agg({'a':nok_mean1})
df['a'].apply(nok_mean1)
df['a'].apply(np.mean)

全部返回

0     0.0
1     3.0
2     6.0
3     9.0
4    12.0
5    15.0
6    18.0
7    21.0
8    24.0
9    27.0
Name: a, dtype: float64

np.mean应用于数据框时,它会按预期工作:

df.agg(nok_mean1)
df.apply(nok_mean1)

a    13.5
b    -8.0
dtype: float64

为了使np.mean可以正常工作,请为x传递一个ndarray:

def nok_mean2(x):
    return np.mean(x.values)

df.agg({'a':nok_mean2})

a    13.5
dtype: float64

我想所有这些都与apply有关,这就是df['a'].apply(nok_mean2)返回属性错误的原因。

我猜源代码中的here

答案 1 :(得分:0)

定义nok_mean函数时,函数定义基本上是说您要为每个

使用np.mean

它找到每一行的平均值并返回结果。 例如,如果您的数据框如下所示:

    a           b
0   [0, 0]      1
1   [3, 4]      -1
2   [6, 8]      -3
3   [9, 12]     -5
4   [12, 16]    -7
5   [15, 20]    -9
6   [18, 24]    -11
7   [21, 28]    -13
8   [24, 32]    -15
9   [27, 36]    -17

然后df.agg({'a', nok_mean})将返回以下内容:

    a
0   0.0
1   3.5
2   7.0
3   10.5
4   14.0
5   17.5
6   21.0
7   24.5
8   28.0
9   31.5

答案 2 :(得分:0)

这与在熊猫方面进行计算有关。

当您传递函数字典时,输入将被视为DataFrame而不是扁平化的数组。之后,默认情况下,所有计算都在索引轴上进行。这就是为什么您要逐行获取收入的原因。

如果您转到docs page,则会看到:

  

聚合操作始终在一个轴上执行,或者   索引(默认)或列轴。这种行为不同于   numpy聚合函数(meanmedianprodsumstd,   var),其中默认值是计算展平的汇总   数组,例如numpy.mean(arr_2d),而不是numpy.mean(arr_2d, axis=0)

__

我认为,模拟numpy行为并将功能字典同时传递给agg的唯一方法是df.agg(nok_mean)['a']