我有一个Dataframe,它有一个电影名称列和3个其他列(让他们称之为A,B和C),这些列是来自3个不同来源的评级。 有很多电影只有一个评级,一些电影与3个论坛的组合,有些没有评级。我想创建一个新列:
到目前为止,这是我的代码中的内容:
def check_rating(rating):
if newyear['Yahoo Rating'] != "\\N":
return rating
else:
if newyear['Movie Mom Rating'] != "\\N":
return rating
else:
if newyear['Critc Rating'] != "\\N":
return rating
else:
return "Unrated"
df['Rating'] = df.apply(check_rating, axis=1)
我得到的错误是:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')
对于我的数据框的视觉效果,这里是newyear.head()
:
我不确定此值错误意味着解决此问题的方法,以及这是否是正确的方法。
答案 0 :(得分:4)
我会做这样的事情:
df = df.replace('\\N', np.nan) # this requires import numpy as np
(df['Yahoo Rating'].fillna(df['Movie Mom Rating']
.fillna(df['Critic Rating']
.fillna("Unrated"))))
您的代码无法正常工作的原因是newyear['Yahoo Rating'] != "\\N"
是一个布尔数组。你在这里说的是if [True, False, True, False]:
。这是歧义的根源。你如何评估这种情况?如果所有这些都是真的,或者只是其中一个是足够的,你会执行吗?
作为M. Klugerford explained,您可以对其进行更改,以便逐行进行评估(因此返回单个值)。但是,逐行应用操作通常很慢,并且pandas具有处理丢失数据的强大工具。这就是我建议这一点的原因。
答案 1 :(得分:1)
您在原始函数中返回rating
..但rating
是行,而不是任何列的值
>>> df
A B C Genre Title Year
0 7 6 \N g1 m1 y1
1 \N 5 7 g2 m2 y2
2 \N \N \N g3 m3 y3
3 \N 4 1 g4 m4 y4
4 \N \N 3 g5 m5 y5
>>> def rating(row):
if row['A'] != r'\N':
return row['A']
if row['B'] != r'\N':
return row['B']
if row['C'] != r'\N':
return row['C']
return 'Unrated'
>>> df['Rating'] = df.apply(rating, axis = 1)
>>> df
A B C Genre Title Year Rating
0 7 6 \N g1 m1 y1 7
1 \N 5 7 g2 m2 y2 5
2 \N \N \N g3 m3 y3 Unrated
3 \N 4 1 g4 m4 y4 4
4 \N \N 3 g5 m5 y5 3