2017-05-05 49 views
2

當通過lambda調用熊貓apply()函數時,規則/過程是什麼?下面的例子。沒有lambda顯然,整個系列(df [列名])被傳遞給「測試」函數,該函數拋出一個錯誤,試圖對系列進行布爾運算。pandas適用()帶和不帶lambda

如果通過lambda調用相同的函數,它將起作用。迭代每行都傳遞爲「x」,df [列名]返回當前行中該列的單個值。

這就像lambda正在移除一個維度。任何人都有解釋或指向這個具體的文檔?謝謝。

實施例1用的λ,工程確定

print("probPredDF columns:", probPredDF.columns) 

def test(x, y): 
    if x==y: 
     r = 'equal' 
    else: 
     r = 'not equal' 
    return r  

probPredDF.apply(lambda x: test(x['yTest'], x[ 'yPred']), axis=1).head() 

實施例1輸出

probPredDF columns: Index([0, 1, 'yPred', 'yTest'], dtype='object') 

Out[215]: 
0 equal 
1 equal 
2 equal 
3 equal 
4 equal 
dtype: object 

實施例2無拉姆達,對一系列誤差拋出布爾運算

print("probPredDF columns:", probPredDF.columns) 

def test(x, y): 
    if x==y: 
     r = 'equal' 
    else: 
     r = 'not equal' 
    return r  

probPredDF.apply(test(probPredDF['yTest'], probPredDF[ 'yPred']), axis=1).head() 

實施例2輸出

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 
+0

請使用代碼格式化這個問題,很難否則解密。 – pshep123

+0

@piRSquared我覺得我還太低調。上次我試着告訴我編輯隊列已滿。自那以後,我一直沒有離開過。 – pshep123

回答

3

沒有什麼魔約lambda。它們是一個參數中的函數,可以內聯定義,並且沒有名稱。您可以在預期使用lambda的地方使用函數,但函數也需要使用一個參數。你需要做這樣的事情......

把它定義爲:

def wrapper(x): 
    return test(x['yTest'], x['yPred']) 

使用它作爲:

probPredDF.apply(wrapper, axis=1) 
+0

加一,因爲這是一個很好的答案,所有......但我不得不不同意! ** IS **對於'lambda'有點神奇。 – piRSquared

+1

在許多層面上,我仍然發現python不可思議,因爲它使我作爲一名程序員非常具有生產力。但我不認爲lambda包含比理解更多的魔法,並且肯定比裝飾者更少魔術...... :-) –

+0

Touche ...這裏沒有參數 – piRSquared