2013-10-04 18 views
4

我試圖避免蟒蛇嵌套循環這裏使用的λ申請使用下面這種說法來創建新列 :使用lambda應用pd.DataFrame而不是嵌套循環的Python有可能嗎?

from pandas import * 
import pandas as pd  
df = pd.DataFrame((np.random.rand(100, 4)*100), columns=list('ABCD')) 
df['C'] = df.apply(lambda A,B: A+B) 

類型錯誤:(「()到底需要2個參數(1給出)」 ,發生在索引A')

顯然這不起作用任何建議?

+1

你的申請因爲默認情況下不工作,它的工作原理列明智的,再加上你誤解了lambda參數實際代表什麼,所以你的lambda func不會像你期望的那樣映射到列。如果你想讓它工作在行上,你需要做這樣的事情''df ['c'] = df.apply(lambda row:row.A + row.B,axis = 1)''但@ miku的答案將達到你想並且更簡單 – EdChum

+0

@EdChum,'df.apply(lambda s:sA + sC,axis = 1)'產生一個'AttributeError:('''''''''''''''''''' 0')'熊貓0.12;但是,'df.apply(lambda s:s ['A'] + s ['C'],axis = 1)'有效。 – miku

+0

@miku並沒有意識到這一點,看起來像一個現在固定在0.12的bug,我個人總是使用'[]',因爲它對我來說更好。感謝您指出了這一點。 – EdChum

回答

7

是否要添加列A和列B並將結果存儲在C?然後,你可以把它簡單:

df.C = df.A + df.B 

由於@EdChum在評論中指出,在apply的函數參數是一個系列,在默認情況下軸0這是行(軸1意味着列):

>>> df.apply(lambda s: s)[:3] 
      A   B   C   D 
0 57.890858 72.344298 16.348960 84.109071 
1 85.534617 53.067682 95.212719 36.677814 
2 23.202907 3.788458 66.717430 1.466331 

在這裏,我們添加的第一個和第二行:

>>> df.apply(lambda s: s[0] + s[1]) 
A 143.425475 
B 125.411981 
C 111.561680 
D 120.786886 
dtype: float64 

要在列工作,使用axis=1關鍵字參數:

>>> df.apply(lambda s: s[0] + s[1], axis=1) 
0  130.235156 
1  138.602299 
2  26.991364 
3  143.229523 
... 
98 152.640811 
99  90.266934 

其產生相同的結果,通過名稱引用的列:

>>> (df.apply(lambda s: s[0] + s[1], axis=1) == 
    df.apply(lambda s: s['A'] + s['B'], axis=1)) 
0  True 
1  True 
2  True 
3  True 
... 
98 True 
99 True