Python 将函数应用于DataFrame列会产生numpy错误
起初,这似乎是一个基本的过程,但我不断遇到以下错误:Python 将函数应用于DataFrame列会产生numpy错误,python,pandas,numpy,dataframe,mean,Python,Pandas,Numpy,Dataframe,Mean,起初,这似乎是一个基本的过程,但我不断遇到以下错误: TypeError: 'numpy.float64' object is not iterable 我有一个关于一个人和他的表演的数据框架。我想找出他前两名的平均成绩。我编写了以下函数 def second(num): bk = max(num) count = 0 m1 = m2 = float('-inf') for x in num: count += 1 if x
TypeError: 'numpy.float64' object is not iterable
我有一个关于一个人和他的表演的数据框架。我想找出他前两名的平均成绩。我编写了以下函数
def second(num):
bk = max(num)
count = 0
m1 = m2 = float('-inf')
for x in num:
count += 1
if x >= m1:
m1, m2 = x, m1
elif x > m2:
m2 = x
return np.mean([m2, bk]) if count >= 2 else None
数据帧如下所示:
Person Rat
8612 Jeff Smith 2.4
9178 Jeff Smith 7.2
9767 Jeff Smith 9.9
10359 Jeff Smith 9.6
10963 Jeff Smith 6.6
11515 Jeff Smith 4.9
12095 Jeff Smith 3.2
12697 Jeff Smith 1.1
我执行了以下操作并收到一个错误:
df['avg'] = df.Rat.apply(lambda x: second(x))
一种方法是首先对
df
进行排序,然后使用groupby
并与head
和mean
进行聚合:
>>> df.sort_values('Rat', ascending=False).groupby('Person').agg(lambda x: x.head(2).mean())
Rat
Person
Jeff Smith 9.75
这将为您提供每个人的两个最高评分的平均值。您可以尝试以下方法:
In [5]: df = pd.read_clipboard()
In [6]: df
Out[6]:
Person Rat
8612 Jeff Smith 2.4
9178 Jeff Smith 7.2
9767 Jeff Smith 9.9
10359 Jeff Smith 9.6
10963 Jeff Smith 6.6
11515 Jeff Smith 4.9
12095 Jeff Smith 3.2
12697 Jeff Smith 1.1
对Rat上的数据帧进行排序
In [18]: df = df.sort("Rat", ascending=0)
In [19]: df
Out[19]:
Person Rat
9767 Jeff Smith 9.9
10359 Jeff Smith 9.6
9178 Jeff Smith 7.2
10963 Jeff Smith 6.6
11515 Jeff Smith 4.9
12095 Jeff Smith 3.2
8612 Jeff Smith 2.4
12697 Jeff Smith 1.1
获取Rat
前两个值的平均值
In [21]: avg = df.head(2).loc[:, "Rat"].mean()
In [24]: avg
Out[24]: 9.75
如前所述,您将函数应用于
系列
而不是数据帧
。当您运行Series.apply
时,您的函数将迭代地应用于序列的每个元素,而不是整个序列。(这就是为什么会出现迭代错误。)
当您调用DataFrame.apply
时,情况就不同了:在这种情况下,您的函数会迭代地应用到数据帧中的每一列(或每一行)
尝试:df['avg']=df[['Rat']]。应用(秒)
。请注意,我将df['Rat']]
置于非df['Rat']
。额外的一组括号强制切片返回一个单列数据帧,而不是一个序列
这行吗?@user2989523我想这可能是因为
df.Rat.apply(lambda x:second(x))
将函数应用于列中的每个(float)值,而不是整个列。num中x的等行将导致抛出错误(num
是浮点)。