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 colorser
yellow cuando (df['Set'] == 'Z') & (df['Type'] == 'A') 
- de lo contrario 
bluecuando(df['Set'] == 'Z') & (df['Type'] == 'B')  
- de lo contrario 
purplecuando(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.wheresuperamap, 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
ifelsedeclaraciones 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
applyenfoque 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
assignyapply, 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
.locmé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,
dfel 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/4Ej. Memorizar en un caso 10,000 filas con 2,500 o menos valores distintos.
fuente
random.choices().