2012-05-23 14 views
24

Ho un DataFrame con alcune colonne. Una colonna contiene un simbolo per il quale viene utilizzata la valuta, ad esempio un euro o un simbolo di dollaro. Un'altra colonna contiene un valore di budget. Ad esempio, in una riga potrebbe significare un budget di 5000 in euro e nella riga successiva potrebbe indicare un budget di 2000 in dollari.Valori di colonna di riempimento condizionale basati su un altro valore di colonna nei panda

In panda vorrei aggiungere una colonna in più al mio DataFrame, normalizzando i budget in euro. Quindi, in sostanza, per ogni riga il valore nella nuova colonna deve essere il valore della colonna del budget * 1 se il simbolo nella colonna della valuta è un simbolo dell'euro e il valore nella nuova colonna deve essere il valore della colonna del budget * 0,78125 se il simbolo nella colonna della valuta è un segno di dollaro.

So come aggiungere una colonna, riempirla con valori, copiare valori da un'altra colonna ecc. Ma non come riempire la nuova colonna in base al valore di un'altra colonna.

Qualche suggerimento?

risposta

45

Probabilmente si desidera fare

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget']) 
+1

È possibile fare qualcosa di simile ma con parole anziché numeri? –

5

risultati simili con uno stile alternativo potrebbe essere quello di scrivere una funzione che esegue l'operazione che si desidera su una riga, utilizzando row['fieldname'] sintassi per accedere ai singoli valori/colonne, e poi eseguire un metodo DataFrame.apply su di essa

Questo fa eco la risposta alla domanda legata qui: pandas create new column based on values from other columns

def normalise_row(row): 
    if row['Currency'] == '$' 
    ... 
    ... 
    ... 
    return result 

df['Normalized'] = df.apply(lambda row : normalise_row, axis=1) 
1

Prendendo il suggerimento di Tom Kimber un passo avanti, è possibile utilizzare un dizionario delle funzioni per impostare le varie condizioni per le proprie funzioni. Questa soluzione sta ampliando la portata della domanda.

Sto utilizzando un esempio da un'applicazione personale.

# write the dictionary 

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col): 
    calculations = { 
      'CPMV' : df_name[metric_col]/1000 * df_name[rate_col], 
      'Free' : 0 
      } 
    df_method = df_name[cost_method_col] 
    return calculations.get(df_method, "not in dict") 

# call the function inside a lambda 

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row, 
cost_method_col='cost method', 
metric_col='metric', 
rate_col='rate', 
total_planned_col='total planned'), axis = 1) 

    cost method metric rate total planned spend 
0  CPMV 2000 100   1000 200.0 
1  CPMV 4000 100   1000 400.0 
4  Free  1  2    3 0.0 
Problemi correlati