2017-08-02 66 views
1

在熊貓我知道如下的功能可應用於:如何應用一個函數接收兩個參數作爲與熊貓列?

df.apply(f, axis=1) 

不過,我已經接收兩個參數,例如功能假設:

def a_sum(x,y): 
    return x+y 

如何申請的以上通過採用作爲參數的ColAColB元件功能:

ColA ColB ColC ColD 
1 2 True False 
1 1 True False 
1 4 True False 
... 
1 10 True False 

爲了產生第是新列ColF

ColA ColB ColC ColD ColF 
1 2 True False 3 
1 1 True False 2 
1 4 True False 5 
... 
1 10 True False 11 
+1

這是一個典型的例子嗎?因爲總結2列的速度更快。 –

+0

是的,它實際上是一樣的......問題是,一列是一個字符串,但大熊貓似乎把它作爲一個浮點數,雖然我把它投入到一個int –

+1

這是你想要的嗎? 'df.iloc [:,:2] .astype(int).sum(axis = 1)' –

回答

4
from itertools import starmap 

df.assign(F=list(starmap(a_sum, df[['ColA', 'ColB']].values))) 

    ColA ColB ColC ColD F 
0  1  2 True False 3 
1  1  1 True False 2 
2  1  4 True False 5 
3  1 10 True False 11 

時序
大型數據

df = pd.concat([df] * 1000, ignore_index=True) 

%timeit df.assign(F=list(starmap(a_sum, df[['ColA', 'ColB']].values))) 
%timeit df.assign(F=df.apply(lambda row: a_sum(row.ColA, row.ColB), axis=1)) 

100 loops, best of 3: 5.01 ms per loop 
10 loops, best of 3: 90.7 ms per loop 
+0

哪個更有效率? –

+1

在小數據,相同。在大數據...'starmap' – piRSquared

+0

雖然這個工作,我得到了:'TypeError:不支持的操作數類型(S)爲 - :'str'和'int'' ...任何想法如何解決它? –

2

當使用applyaxis=1,你傳遞一個排它也是一個系列的功能,自定義適用於這裏f,你可以用一個lambda函數,它的行把它包然後將ColAColB作爲參數傳遞給f

df.apply(lambda row: f(row.ColA, row.ColB), axis=1) 

df['ColE'] = df.apply(lambda row: a_sum(row.ColA, row.ColB), axis=1) 
df 
#ColA ColB ColC ColD ColE 
#0 1  2 True False 3 
#1 1  1 True False 2 
#2 1  4 True False 5 
#3 1  10 True False 11 
+0

雖然這個工作,我得到了:'TypeError:不支持的操作數類型的 - :'str'和'int'' ...任何想法如何解決它? –

+1

檢查ColA和ColB的數據類型。確保他們是你所期望的。 'df [['ColA','ColB']]。dtypes'。 – Psidom

+0

是的,我試圖用'int()'來施放它。但是,我得到:'ValueError:int()以10爲底的無效文字:17087,17098' –

1
df['ColF'] = df.apply(lambda x: a_sum(x['ColA'], x['ColB']), axis=1) 
1

也可以使用

df['ColF'] = [a+b for a,b in zip(df['ColA'],df['ColB'])] 

,或者如果你真正的功能是自訂

df['ColF'] = [a_sum(a,b) for a,b in zip(df['ColA'],df['ColB'])] 
相關問題