2017-05-08 71 views
3

我想要學習如何使用lambda表達式而不使用for循環,該函數從數據框的兩列的行中獲取參數並寫入結果到另一列。使用lambda函數從不同列的數據幀中獲取參數

import pandas as pd 

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]}) 

print(df) 

df["C"] = "" 

print(df) 

def add_num(num1 ,num2): 
    return num1 + num2 

for i in range(len(df)): 
    df["C"][i] = add_num(df["A"][i], df["B"][i]) 
print(df) 

回答

2

您可以撥打apply在DF傳球ARG axis=1這將遍歷行明智的,你可以再分選擇在lambda興趣的列傳遞給你的FUNC:

In [49]:  
df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]}) 
df["C"] = "" 
​ 
def add_num(num1 ,num2): 
    return num1 + num2 
​ 
df["C"] = df.apply(lambda x: add_num(x["A"], x["B"]), axis=1) 
print(df) 

    A B C 
0 1 2 3 
1 2 3 5 
2 3 4 7 

注應該避免使用apply,大多數操作可以使用矢量化方法執行,我知道這只是爲了學習,但你應該尋找一個numpy或其他的矢量化的ufunc

+0

還有一個問題=)這個版本的性能與for循環版本有差別嗎? – s900n

+0

不,它只是語法糖 – EdChum

+0

不,這不是事實。當調用''lambda'時調用'add_num'函數會比直接調用循環中的'add_num'要慢。然而,這可能是循環對'apply'效率更高一點。但我的猜測是,使用'lambda'的抽象將會變慢。 – MSeifert

0

這應該這樣做:

import pandas as pd 

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]}) 

def add_num(num1 ,num2): 
    return num1 + num2 

df['C'] = df.T.apply(lambda x: add_num(x['A'], x['B'])) 
0

顯而易見的答案是:不使用lambda時更簡單表達式工作:

df['C'] = df['A'] + df['B'] 

因爲這將使用矢量操作。

@ EdChum的答案已經涵蓋lambdaapply的方法,所以我不會再顯示它。

相關問題