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) ]
根据foraggregate
,您应该能够使用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
version0.23.4
,numpy
version1.15.4
,python
version3.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)}
都会产生预期的结果,即使它们遵循相同的模式。