2013-05-03 33 views
119

Ho alcuni problemi con i Panda funzione di applicare quando si utilizzano più colonne con il seguente dataframePandas: Come usare applicare la funzione a più colonne

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

e la seguente funzione

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

Quando Provo ad applicare questa funzione con:

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

Viene visualizzato il messaggio di errore:

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

Non capisco questo messaggio, ho definito il nome corretto.

vivamente apprezzare qualsiasi aiuto su questo tema

Aggiornamento

Grazie per il vostro aiuto. Ho fatto davvero degli errori di sintassi con il codice, l'indice dovrebbe essere messo ''. Tuttavia ho ancora lo stesso problema utilizzando una funzione più complessa come ad esempio:

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

Grazie

+0

Probabilmente è stato spostato da questo molto tempo fa, ma penso che la funzione definita nell'aggiornamento abbia una variabile indefinita: df. – rocarvaj

risposta

193

Sembra che tu abbia dimenticato il '' della tua stringa.

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 

BTW, a mio parere, come segue è più elegante:

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

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

Grazie, hai ragione ho dimenticato il ''. Tuttavia ho ancora lo stesso problema con una funzione più complessa. Apprezzerei molto il tuo aiuto. Grazie – Andy

+2

@Andy seguente [53-54] consente di applicare funzioni più complesse. –

+0

@Andy è possibile definire la funzione complessa come la modalità In [53]. – waitingkuo

20

Se si desidera solo per calcolare (colonna A)% (colonna b), non è necessario apply , fallo direttamente:

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

Lo so, è solo un esempio per mostrare il mio problema nell'applicare una funzione a più colonne – Andy

6

Diciamo che vogliamo applicare una funzione ADD5 a colonne 'a' e 'b' di dataframe df

def add5(x): 
    return x+5 

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