2016-08-07 53 views
0

我有一個數據框有一個電影名稱列和3個其他列(我們稱之爲A,B和C),它們是來自3個不同來源的評級。 有很多電​​影只有一個評級,一些電影有來自3個論壇的組合,有些沒有評級。我想創建一個新列將:如何基於其他三列之一創建新列?

  1. 如果列從相關B.
  2. 評價,使用A.
  3. 如果A柱是空的,獲得相關的評價。如果B柱是空的,從C
  4. 獲得相關評級
  5. 若C柱是空的,返回「未分級」

這是我在我的代碼至今:

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') 

對於Visual我的數據框,這裏是newyear.head()

newyear dataframe

我不知道這是什麼價值的錯誤意味着解決這個問題,如果這是正確的做法。

+2

請發佈您的數據框的小樣本(作爲文本,而不是圖像)和預期的輸出。 –

回答

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 
+0

非常感謝!我不知道如何使用def python函數從列行到列行,所以這是非常有用的。 – Josh

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,你可以改變它,所以它是逐行評估(因此返回一個單一的值)。但是,逐行應用操作通常很慢,熊貓有很好的工具來處理丟失的數據。這就是爲什麼我提出這個建議。

+0

哇這非常有用!謝謝你解釋這個。 – Josh