2013-05-03 89 views
119

我有一些問題與熊貓使用具有以下數據框熊貓:如何使用應用功能的多個列

df = DataFrame ({'a' : np.random.randn(6), 
      'b' : ['foo', 'bar'] * 3, 
      'c' : np.random.randn(6)}) 

及以下功能多列時應用功能,

def my_test(a, b): 
    return a % b 

當我嘗試應用此功能:

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1) 

我收到錯誤消息:

NameError: ("global name 'a' is not defined", u'occurred at index 0') 

我不明白這個消息,我正確定義了名字。

我將高度讚賞在這個問題上

更新

感謝您的幫助任何幫助。我確實在代碼中犯了一些語法錯誤,索引應該放在''。不過我還有使用更復雜的功能相同的問題,如:

def my_test(a): 
    cum_diff = 0 
    for ix in df.index(): 
     cum_diff = cum_diff + (a - df['a'][ix]) 
    return cum_diff 

謝謝

+0

很久以前,你可能已經從這裏開始了,但我認爲你在Update中定義的函數有一個未定義的變量:df。 – rocarvaj 2017-12-06 14:07:30

回答

193

似乎你忘記了你的字符串''

In [43]: df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1) 

In [44]: df 
Out[44]: 
        a b   c  Value 
      0 -1.674308 foo 0.343801 0.044698 
      1 -2.163236 bar -2.046438 -0.116798 
      2 -0.199115 foo -0.458050 -0.199115 
      3 0.918646 bar -0.007185 -0.001006 
      4 1.336830 foo 0.534292 0.268245 
      5 0.976844 bar -0.773630 -0.570417 

順便說一句,在我看來,以下方式是更優雅:

In [53]: def my_test2(row): 
....:  return row['a'] % row['c'] 
....:  

In [54]: df['Value'] = df.apply(my_test2, axis=1) 
+0

謝謝,你是對的我忘了''。不過,我仍然有一個更復雜的功能相同的問題。我非常感謝你的幫助。謝謝 – Andy 2013-05-03 08:58:37

+2

@以下[53-54]允許您應用更復雜的功能。 – 2013-05-03 09:29:23

+0

@你可以像In [53]那樣定義你的複雜函數。 – waitingkuo 2013-05-03 09:37:49

20

如果你只是想計算(列)%(b列),你不需要apply ,直接做:

In [7]: df['a'] % df['c']                                       
Out[7]: 
0 -1.132022                                          
1 -0.939493                                          
2 0.201931                                          
3 0.511374                                          
4 -0.694647                                          
5 -0.023486                                          
Name: a 
+7

我知道,這只是一個例子,顯示我的問題在應用一個函數到多列 – Andy 2013-05-03 08:22:37

6

比方說,我們要應用功能ADD5到列 'a' 和數據幀DF

的 'B'
def add5(x): 
    return x+5 

df[['a', 'b']].apply(add5)