与Dataframe聚合方法相关的传递列表问题和Pandas无法与聚合函数列表聚合
考虑这个数据帧
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您应该能够使用以下方式指定要聚合的列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
解决办法:这个问题与申请np.mean系列有关。我们来看几个例子:
def nok_mean(x):
return x.mean()
df.agg({'a': nok_mean})
a 13.5
dtype: float64
这可以正常工作,因为您使用的是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按照预期的方式使用函数传递一个ndarray for 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)返回属性错误。








暂无数据