then - python elif else
Creando una nueva columna basada en la condiciĆ³n if-elif-else (5)
Tengo un DataFrame df
:
A B
a 2 2
b 3 1
c 1 3
Quiero crear una nueva columna basada en los siguientes criterios:
si la fila A == B: 0
si la fila A > B: 1
si la fila A < B: -1
por lo que dada la tabla anterior, debe ser:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Para los casos típicos, if else
no hago np.where(df.A > df.B, 1, -1)
, los pandas proporcionan una sintaxis especial para resolver mi problema con un solo paso (sin la necesidad de crear 3 nuevas columnas y luego combinarlas). el resultado)?
Las operaciones en fila pueden llevar demasiado tiempo para grandes conjuntos de datos. Un mejor enfoque es encontrar el índice de las filas que coinciden con la condición y luego asignar valores a la columna requerida (''C'') de esas filas.
df.loc[df[''A''] == df[''B''], ''C''] = 0
df.loc[df[''A''] > df[''B''], ''C''] = 1
df.loc[df[''A''] < df[''B''], ''C''] = -1
Para esta relación en particular, podría usar np.sign
:
>>> df["C"] = np.sign(df.A - df.B)
>>> df
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Para formalizar algunos de los enfoques expuestos anteriormente:
Cree una función que opere en las filas de su marco de datos de la siguiente manera:
def f(row):
if row[''A''] == row[''B'']:
val = 0
elif row[''A''] > row[''B'']:
val = 1
else:
val = -1
return val
Luego aplíquelo a su marco de datos pasando la opción axis=1
:
In [1]: df[''C''] = df.apply(f, axis=1)
In [2]: df
Out[2]:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Por supuesto, esto no está vectorizado por lo que el rendimiento puede no ser tan bueno cuando se escala a una gran cantidad de registros. Aún así, creo que es mucho más legible. Especialmente procedentes de un fondo SAS.
Digamos que arriba uno es su marco de datos original y desea agregar una nueva columna ''antigua''
Si la edad es mayor de 50, entonces consideramos como mayor = sí de lo contrario Falso
Paso 1: Obtén los índices de las filas cuya edad es mayor de 50.
row_indexes=df[df[''age'']>=50].index
Paso 2: usando .loc podemos asignar un nuevo valor a la columna
df.loc[row_indexes,''elderly'']="yes"
Igual para menores de 50 años.
row_indexes=df[df[''age'']<50].index
df[row_indexes,''elderly'']="no"
df.loc[df[''A''] == df[''B''], ''C''] = 0
df.loc[df[''A''] > df[''B''], ''C''] = 1
df.loc[df[''A''] < df[''B''], ''C''] = -1
Fácil de resolver utilizando indexación. La primera línea de código se lee así, si la columna ''A'' es igual a la columna ''B'', cree y establezca la columna ''C'' igual a 0. Nota No intenté ejecutar esto, por lo que es posible que el código deba modificarse a lo siguiente, df.ix [(df [''A''] == df [''B'']), ''C''] = 0, que usa paréntesis alrededor de la condición.