python - create - Creación de variables pandas utilizando múltiples If-else
pandas create new column based on condition (1)
Necesita ayuda con las declaraciones múltiples IF-ELSE de Pandas. Tengo un conjunto de datos de prueba (titánico) de la siguiente manera:
ID Survived Pclass Name Sex Age
1 0 3 Braund male 22
2 1 1 Cumings, Mrs. female 38
3 1 3 Heikkinen, Miss. Laina female 26
4 1 1 Futrelle, Mrs. female 35
5 0 3 Allen, Mr. male 35
6 0 3 Moran, Mr. male
7 0 1 McCarthy, Mr. male 54
8 0 3 Palsson, Master male 2
donde Id es la identificación del pasajero. Quiero crear una nueva variable de indicador en este marco de datos que tiene la siguiente regla:
if Sex=="female" or (Pclass==1 and Age <18) then 1 else 0.
Ahora para hacer esto probé algunos enfoques. Así es como me acerqué primero:
df=pd.read_csv(data.csv)
for passenger_index,passenger in df.iterrows():
if passenger[''Sex'']=="female" or (passenger[''Pclass'']==1 and passenger[''Age'']<18):
df[''Prediction'']=1
else:
df[''Prediction'']=0
El problema con el código anterior es que crea una variable de Predicción en df pero con todos los valores como 0.
Sin embargo, si uso el mismo código pero en cambio lo publico en un diccionario, da la respuesta correcta como se muestra a continuación:
prediction={}
df=pd.read_csv(data.csv)
for passenger_index,passenger in df.iterrows():
if passenger[''Sex'']=="female" or (passenger[''Pclass'']==1 and passenger[''Age'']<18):
prediction[passenger[''ID'']=1
else:
prediction[passenger[''ID'']=0
Esto da una predicción dict con claves como ID y valores como 1 o 0 basados en la lógica anterior.
Entonces, ¿por qué la variable df funciona incorrectamente ?. Incluso intenté definir primero una función y luego llamarla. Dio los mismos ans que primero.
Entonces, ¿cómo podemos hacer esto en pandas ?.
En segundo lugar, creo que se puede hacer lo mismo si solo podemos usar algunas declaraciones if-else múltiples. Sé np.where pero no permite agregar ''y'' condición. Entonces esto es lo que estaba intentando:
df[''Prediction'']=np.where(df[''Sex'']=="female",1,np.where((df[''Pclass'']==1 and df[''Age'']<18),1,0)
Lo anterior dio un error para la palabra clave ''y'' en donde.
Entonces alguien puede ayudar ?. Las soluciones con múltiples enfoques utilizando np.where (simple if-else like) y el uso de alguna función (applymap, etc.) o modificaciones a lo que escribí anteriormente serían muy apreciadas.
Además, ¿cómo hacemos lo mismo utilizando algún mapa de aplicación o método de aplicación / mapa de df ?.
En lugar de recorrer las filas usando df.iterrows
(que es relativamente lento), puede asignar los valores deseados a la columna Prediction
en una tarea:
In [27]: df[''Prediction''] = ((df[''Sex'']==''female'') | ((df[''Pclass'']==1) & (df[''Age'']<18))).astype(''int'')
In [29]: df[''Prediction'']
Out[29]:
0 0
1 1
2 1
3 1
4 0
5 0
6 0
7 0
Name: Prediction, dtype: int32
Para su primer acercamiento, recuerde que df[''Prediction'']
representa una columna entera de df
, entonces df[''Prediction'']=1
asigna el valor 1 a cada fila en esa columna. Dado que df[''Prediction'']=0
fue la última asignación, la columna completa se llenó con ceros.
Para su segundo enfoque, tenga en cuenta que necesita usar &
no and
para realizar una operación lógica y de elementos con dos matrices NumPy o Pandas NDFrames. Por lo tanto, podrías usar
In [32]: np.where(df[''Sex'']==''female'', 1, np.where((df[''Pclass'']==1)&(df[''Age'']<18), 1, 0))
Out[32]: array([0, 1, 1, 1, 0, 0, 0, 0])
aunque creo que es mucho más simple usarlo |
para lógica-y &
para lógica-y:
In [34]: ((df[''Sex'']==''female'') | ((df[''Pclass'']==1) & (df[''Age'']<18)))
Out[34]:
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 False
dtype: bool