2012-05-23 53 views
24

Tengo DataFrame con algunas columnas. Una columna contiene un símbolo para el que se usa la moneda, por ejemplo, un euro o un signo de dólar. Otra columna contiene un valor de presupuesto. Entonces, por ejemplo, en una fila podría significar un presupuesto de 5000 en euros y en la siguiente fila podría decirse un presupuesto de 2000 en dólares.Rellenar condicionalmente valores de columna basados ​​en el valor de otras columnas en pandas

En pandas me gustaría agregar una columna extra a mi DataFrame, normalizando los presupuestos en euros. Básicamente, para cada fila, el valor en la nueva columna debe ser el valor de la columna de presupuesto * 1 si el símbolo en la columna de moneda es un símbolo del euro, y el valor en la nueva columna debe ser el valor de la columna del presupuesto * 0,78125 si el símbolo en la columna de la moneda es un signo de dólar.

Sé cómo agregar una columna, completarla con valores, copiar valores de otra columna, etc., pero no cómo llenar la nueva columna de forma condicional en función del valor de otra columna.

¿Alguna sugerencia?

Respuesta

45

Usted probablemente querrá hacer

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

¿Es posible hacer algo como esto pero con palabras en vez de números? –

5

resultados similares a través de un estilo alternativo podría ser la de escribir una función que lleva a cabo la operación deseada en una fila, utilizando row['fieldname'] sintaxis para acceder a valores/columnas individuales, y luego realizar un método DataFrame.apply sobre ella

Esto se hace eco de la respuesta a la pregunta vinculada aquí: 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

Tomando la sugerencia de Tom Kimber un paso más allá, puede usar un diccionario de funciones para establecer varias condiciones para sus funciones. Esta solución está expandiendo el alcance de la pregunta.

Estoy usando un ejemplo de una aplicación personal.

# 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 
Cuestiones relacionadas