dataframe - seleccionar - Rellenar condicionalmente valores de columna basados en el valor de otras columnas en pandas
seleccionar columnas pandas python (3)
Tengo un 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.
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?
Probablemente quieras hacer
df[''Normalized''] = np.where(df[''Currency''] == ''$'', df[''Budget''] * 0.78125, df[''Budget''])
Resultados similares a través de un estilo alternativo pueden ser escribir una función que realiza la operación que desea en una fila, utilizando la sintaxis row[''fieldname'']
para acceder a valores / columnas individuales, y luego realizar un método DataFrame.apply sobre ella
Esto hace eco de la respuesta a la pregunta vinculada aquí: los pandas crean una nueva columna basada en valores de otras columnas
def normalise_row(row):
if row[''Currency''] == ''$''
...
...
...
return result
df[''Normalized''] = df.apply(lambda row : normalise_row, axis=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