2014-07-16 9 views
5

Ho un set di dati, df, con due variabili, xey. Voglio scrivere una funzione che esegue le operazioni seguenti:Come scrivere una funzione lambda che è condizionata da due variabili (colonne) in python

x se x> 100 e y < 50 altro y

Sono abituato a fare l'analisi dei dati in STATA quindi sono relativamente nuovo per panda per l'analisi dei dati. Se aiuta, in Stata sarebbe simile:

sostituire x = cond (x> 100 & y < 50, x, y)

In altre parole, la funzione è subordinata a due colonne in df e restituiscono un valore da una variabile o dall'altra in ogni riga a seconda che la condizione sia soddisfatta.

Finora mi hanno creato nuove variabili attraverso nuove funzioni come:

df.dummyVar = df.x.apply (lambda x: 1 se x> 100 altro 0)

Utilizzando StackOverflow e la documentazione, sono riuscito solo a scoprire come applicare una funzione dipendente da una singola variabile a più di una colonna (usando l'opzione asse). Per favore aiuto.

risposta

11

Uso where:

df['dummyVar '] = df['x'].where((df['x'] > 100) & (df['y'] < 50), df['y']) 

Questo sarà molto più veloce di eseguire un'operazione di applicazione in quanto è Vectorised.

+0

Questo è esattamente ciò di cui avevo bisogno. E questo è fantastico perché posso già vedere come posso espanderlo a condizionali su 3 o più variabili. Grazie! – seeiespi

+0

@seeiespi sei il benvenuto, puoi accettarlo come risposta, ci sarà un segno di spunta sotto i pulsanti di voto. Usare apply e iterating dovrebbe sempre essere l'ultima scelta, se possibile trovare un metodo che funzioni sull'intero dataframe – EdChum

5

Ti piace questa:

f = lambda x, y: x if x>100 and y<50 else y 

Lambda (s) in Python sono equivalenti ad una definizione di funzione normale.

def f(x, y): 
    return x if x>100 and y<50 else y 

NB: Il corpo di una Lambda deve essere un'espressione valida. Questo significa che non puoi usare cose come: return per esempio; a Lambda restituirà l'ultima espressione valutata.

Per qualche buona lettura vedi:

+0

Avevo effettivamente scritto una funzione come questa ma non è stata in grado di implementarla in modo che potesse scorrere ogni riga senza un loop. La risposta fornita da EdChum fa esattamente questo. Se si conosce un modo per farlo usando questa funzione definita, sono sicuro che potrei farne uso in futuro. Grazie per l'input :) – seeiespi

+0

@seeiespi Originariamente hai chiesto "Come creare una funzione lambda che richiede due argomenti?" - Ecco come :) :) EdChum ti ha fornito una risposta più allineata con le tue intenzioni/con i tuoi set di dati e i tuoi panda. –

Problemi correlati