2014-09-19 14 views
7

Ho la seguente dataframe:Pandas ricerca basata sul valore

Date best a b c d 
1990 a  5 4 7 2 
1991 c  10 1 2 0 
1992 d  2 1 4 12 
1993 a  5 8 11 6 

Vorrei fare una dataframe come segue:

Date best value 
1990 a  5 
1991 c  2 
1992 d  12 
1993 a  5 

Così sto cercando di trovare un valore in base a un'altra riga valore usando i nomi delle colonne. Ad esempio, il valore per il 1990 nel secondo df dovrebbe cercare "a" dal primo df e la seconda riga dovrebbe cercare "c" (= 2) dal primo df.

Qualche idea?

risposta

4

Si crea una funzione di ricerca e chiamare apply sul dataframe fila-saggio, questo non è molto efficiente per grandi DFS se

In [245]: 

def lookup(x): 
    return x[x.best] 
df['value'] = df.apply(lambda row: lookup(row), axis=1) 
df 
Out[245]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+0

Qualche possibilità di spiegare come funziona questo bit di codice? – 3kstc

+0

@ 3kstc fondamentalmente usiamo 'apply' per iterare sulle righe passando arg' axis = 1' così il lambda qui è la riga quindi per la prima riga 'x' è la prima riga, quindi restituiamo una colonna specifica che in questo caso sarà il valore di "best" per indicizzare quella riga – EdChum

4

v'è una costruito in funzione lookup in grado di gestire questo tipo di situazione (cerca per riga/colonna). Non so quanto sia ottimizzato, ma potrebbe essere più veloce della soluzione applicabile.

In [9]: df['value'] = df.lookup(df.index, df['best']) 

In [10]: df 
Out[10]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+1

Sul dataset toy applicare takes 470us, la ricerca prende 531us – EdChum

+1

Hmm per qualche motivo timeit riceve un errore di memoria quando provo questo anche su un df di dimensioni modeste di dire 4000 righe , per 400 righe ottengo 8.17ms usando apply e 3.05ms usando lookup, quindi mi aspetto che la ricerca sia scalabile meglio – EdChum

+0

La ricerca potrebbe essere preferibile a causa della sintassi più semplice ma entrambi funzionano perfettamente, grazie ragazzi! – AtotheSiv

Problemi correlati