与Dataframe aggregate method passing list problem和Pandas 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'
进行聚合的返回结果不同?
这正在使用pandas
版0.23.4
,numpy
版1.15.4
,python
版3.7.1
答案 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
聚合函数(mean
,median
,prod
,sum
,std
,var
),其中默认值是计算展平的汇总 数组,例如numpy.mean(arr_2d)
,而不是numpy.mean(arr_2d, axis=0)
。
__
我认为,模拟numpy行为并将功能字典同时传递给agg的唯一方法是df.agg(nok_mean)['a']
。