这似乎最初是一个基本过程,但我不断收到以下错误:
TypeError: 'numpy.float64' object is not iterable
我有一个pandas DataFrame与一个人和他的表现。我想找到他的前两个表现分数的平均值。我写了以下函数
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
DataFrame看起来像这样:
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))
答案 0 :(得分:2)
一种方法是先排序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
这将为您提供每个人两个最高评级的平均值。
答案 1 :(得分:0)
你可以试试这个:
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
答案 2 :(得分:0)
如上所述,您将自己的功能应用于Series
而不是DataFrame
。当您运行Series.apply
时,您的函数将迭代应用于系列的每个元素,而不是整个系列。 (这就是你得到迭代错误的原因。)
当您致电DataFrame.apply
时,情况会有所不同:在该上下文中,您的函数会迭代应用于数据框中的每个列(或行)。
尝试:df['avg'] = df[['Rat']].apply(second)
。请注意,我将df[['Rat']]
设置为 df['Rat']
。额外的括号集强制切片返回单个列数据帧而不是系列。
这有用吗?