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
是浮点)。