2015-02-11 18 views
7

Ho verificato la mappa, applicare, mappare e combinare, ma non riesco a trovare un modo semplice per fare quanto segue:Come mappare una funzione utilizzando più colonne nei panda?

Ho un dataframe con 10 colonne. Ho bisogno di passare tre di loro in una funzione che prende scalari e restituisce uno scalare ...

some_func(int a, int b, int c) returns int d 

voglio applicare questo e creare una nuova colonna nella dataframe con il risultato.

df['d'] = some_func(a = df['a'], b = df['b'], c = df['c']) 

Tutte le soluzioni che ho trovato sembrano suggerire di riscrivere some_func a lavorare con serie al posto di scalari, ma questo non è possibile in quanto è parte di un altro pacchetto. Come faccio elegantemente sopra?

+1

dipende da quello che le funzioni state facendo, ma in genere si dovrebbe fare qualcosa di simile 'def func (riga): la riga di ritorno [ 'a'] * row [ 'b'] * row [ 'c'] df.apply (riga lambda: func (riga), asse = 1) 'idealmente y vuoi scrivere la tua funzione in modo che possa operare sull'intera serie in modo da renderla vettoriale, puoi mostrare cosa stai cercando di fare? – EdChum

+0

Se per esempio la tua funzione ha preso 'Series' come parametri, potresti riscriverlo 'def some_func (a, b, c): restituisce un * b * c df ['d'] = some_func (df ['a'], df ['b'], df ['c'])' – EdChum

+0

" some_func "è una funzione complessa che effettua una chiamata SQL per riempire i dati, quindi l'ho semplificata qui. Sto usando df.apply come suggerito. – ashishsingal

risposta

10

Usa pd.DataFrame.apply(), come di seguito:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c']), axis=1) 

NOTA: Come @ashishsingal chiesto circa le colonne, l'argomento axis dovrebbe essere dotata di un valore pari a 1, in quanto il valore di default è 0 (come nel documentation e copiato in basso).

asse: {0 o 'index', 1 o 'colonne'}, default 0

  • 0 o 'index': applicare la funzione di ciascuna colonna
  • o 'colonne': applicare funzione per ogni riga
3

sto usando il seguente:

df['d'] = df.apply(lambda x: some_func(a = x['a'], b = x['b'], c = x['c'])) 

sembra funzionare bene, ma se qualcun altro ha una soluzione migliore, per favore fatemelo sapere.

Problemi correlati