Si solo tiene dos opciones para elegir:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Por ejemplo,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
rendimientos
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Si tiene más de dos condiciones, úselasnp.select
. Por ejemplo, si quieres color
ser
yellow
cuando (df['Set'] == 'Z') & (df['Type'] == 'A')
- de lo contrario
blue
cuando(df['Set'] == 'Z') & (df['Type'] == 'B')
- de lo contrario
purple
cuando(df['Type'] == 'B')
- de lo contrario
black
,
luego usa
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
cuyos rendimientos
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
La comprensión de la lista es otra forma de crear otra columna condicionalmente. Si está trabajando con tipos de objetos en columnas, como en su ejemplo, las comprensiones de listas generalmente superan a la mayoría de los otros métodos.
Ejemplo de comprensión de la lista:
% de pruebas de tiempo:
fuente
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
tamaño),numpy.where
superamap
, pero la comprensión de la lista es el rey (aproximadamente un 50% más rápido quenumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
es notoriamente lento y el DataFrame no debe modificarse durante la iteración.Otra forma de lograrlo es
fuente
Aquí hay otra forma de desollar este gato, usando un diccionario para asignar nuevos valores a las teclas de la lista:
Cómo se ve:
Este enfoque puede ser muy poderoso cuando tiene muchas
ifelse
declaraciones de tipo para hacer (es decir, muchos valores únicos para reemplazar).Y, por supuesto, siempre puedes hacer esto:
Pero ese enfoque es más de tres veces más lento que el
apply
enfoque desde arriba, en mi máquina.Y también puedes hacer esto, usando
dict.get
:fuente
.map()
solución es ~ 10 veces más rápida que.apply()
..apply()
toma 47 segundos, en comparación con solo 5.91 segundos.map()
.Lo siguiente es más lento que los enfoques cronometrados aquí , pero podemos calcular la columna adicional en función del contenido de más de una columna, y se pueden calcular más de dos valores para la columna adicional.
Ejemplo simple usando solo la columna "Establecer":
Ejemplo con más colores y más columnas tomadas en cuenta:
Editar (21/06/2019): Usar plydata
También es posible usar plydata para hacer este tipo de cosas (esto parece aún más lento que usar
assign
yapply
, sin embargo).Simple
if_else
:Anidado
if_else
:fuente
Tal vez esto ha sido posible con las actualizaciones más recientes de Pandas, pero creo que la siguiente es la respuesta más corta y quizás la mejor para la pregunta, hasta ahora. Puedes usar el
.loc
método y usar una o varias condiciones según su necesidad.Resumen de código:
Explicación:
agregue una columna 'color' y establezca todos los valores en "rojo"
Aplica tu única condición:
o múltiples condiciones si quieres:
Puede leer sobre los operadores lógicos de Pandas y la selección condicional aquí: Operadores lógicos para la indexación booleana en Pandas
fuente
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Un revestimiento con
.apply()
método es el siguiente:Después de eso,
df
el marco de datos se ve así:fuente
Si está trabajando con datos masivos, un enfoque memorable sería lo mejor:
Este enfoque será más rápido cuando tenga muchos valores repetidos. Mi regla general es recordar cuando:
data_size
>10**4
&n_distinct
<data_size/4
Ej. Memorizar en un caso 10,000 filas con 2,500 o menos valores distintos.
fuente
random.choices()
.