Pandas-数据帧聚合行为异常

Pandas-数据帧聚合行为异常,pandas,numpy,dataframe,aggregate,series,Pandas,Numpy,Dataframe,Aggregate,Series,与及 考虑这个数据帧 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) ] 根据foraggregate,您应该能够使用dict指定要聚合的列,如下所示: df.agg({'a' : 'mean'}) a b 0

与及

考虑这个数据帧

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) ]
根据for
aggregate
,您应该能够使用
dict
指定要聚合的列,如下所示:

df.agg({'a' : '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
返回

a    13.5
但是,如果您尝试使用像这样的用户定义函数来聚合

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'
进行聚合的结果不同


这是使用
pandas
version
0.23.4
numpy
version
1.15.4
python
version
3.7.1
当你定义
nok_mean
函数时,你的函数定义基本上是说你想要
np.mean
每一行

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

df.agg({'a' : '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

这与熊猫方面的计算方式有关

当您传递一组函数时,输入被视为数据帧,而不是扁平数组。之后,默认情况下,所有计算都在索引轴上进行。这就是为什么你要按行算账

如果您访问,您将看到:

聚合操作始终在轴上执行,或者 索引(默认)或列轴。这种行为不同于
numpy
聚合函数(
mean
median
prod
sum
std
var
),其中默认值是计算被展平的 数组,例如,
numpy.mean(arr\u 2d)
numpy.mean(arr\u 2d)相反,
轴=0)

__


我认为模仿numpy的行为并同时将一系列函数传递给agg的唯一方法是
df.agg(nok_-mean)['a']

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

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

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

a    13.5
dtype: float64
这与预期一样有效,因为您使用的是mean的pandas版本,可应用于系列或数据帧:

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的数据:

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)
返回一个属性错误


我在猜源代码

谢谢。如何将
np.mean
应用于序列而不是行?在
df.agg({'a':np.mean})
的情况下,我们也传递了一个函数的dict,但是熊猫的行为与预期的一样,因此它的内容不止这些。类似地,请注意
df.agg({'a':sum})
df.agg({'a':lambda x:sum(x)}
都会产生预期的结果,即使它们遵循相同的模式。