¿Cómo puedo obtener tres condiciones en np.where (). normalmente usa solo dos condiciones, ¿cómo puedo obtener tres? Al igual que necesito crear una nueva columna Better_Event que almacene 'Verano', 'Invierno' o 'Ambos' en función de la comparación entre el total de medallas ganadas en el evento de verano y el evento de invierno (es decir, la comparación entre las columnas Total_Summer y Total_Winter) usando "np .where () "función.

data['Better_Events'] = np.where(data['Total_Summer']>data['Total_Winter'],'Summer','Winter')

El código anterior solo tiene dos salidas. ¿Cómo lo cambio a tres donde si data ['Total_Summer'] == data ['Total_Winter'] da "Both"

1
rahul dbz 9 oct. 2019 a las 19:59

3 respuestas

La mejor respuesta

Necesita np.select:

Aquí hay un ejemplo:

df=pd.DataFrame({'Total_Summer':[1,2,3,3,6,7],'Total_Winter':[2,2,3,4,5,4]})
print(df)

   Total_Summer  Total_Winter
0             1             2
1             2             2
2             3             3
3             3             4
4             6             5
5             7             4

ahora establezca las condiciones y el valor para cada condición:

cond=[df['Total_Summer']>df['Total_Winter'],df['Total_Summer']<df['Total_Winter'],df['Total_Summer'].eq(df['Total_Winter'])]
values=['Summer','Winter','Both']
df['Better_Events']=np.select(cond,values)
print(df)

   Total_Summer  Total_Winter Better_Events
0             1             2        Winter
1             2             2          Both
2             3             3          Both
3             3             4        Winter
4             6             5        Summer
5             7             4        Summer
4
ansev 9 oct. 2019 a las 17:07

Numpy.select funciona muy bien, sin embargo, quiero presentar una solución alternativa que debería ser mejor cuando las condiciones son más numerosas o complejas:

# numpy is only used to create the test data
import numpy as np
import pandas as pd

total_summer, total_winter = np.split(np.random.randint(low=0, high=15, size=20), 2)

df = pd.DataFrame(data=zip(total_summer, total_winter), columns=["total_summer", "total_winter"])

def find_better_event(row):
    res : str
    if row["total_summer"] > row["total_winter"]:
        res = "Summer"
    elif row["total_summer"] < row["total_winter"]:
        res = "Winter"
    else:
        res = "Both"
    return res

df["better_events"] = df.apply(find_better_event, axis=1)
0
AMC 9 oct. 2019 a las 19:14

Puede usar 'aplicar' con axis = 1:

Total_Summer  Total_Winter
0            74            17
1            75            29
2            48            64
3            77            77
4            16            38

df.apply(lambda r: "Both" if r.Total_Summer==r.Total_Winter else "Summer" if r.Total_Summer>r.Total_Winter else "Winter" ,axis=1) 

Out: 
0    Summer
1    Summer
2    Winter
3      Both
4    Winter
dtype: object

O puede usar np.where dos veces:

np.where( df.Total_Summer.eq(df.Total_Winter),"Both", np.where(df.Total_Summer.gt(df.Total_Winter),"Summer","Winter")) 

El segundo método es más rápido.

0
kantal 9 oct. 2019 a las 18:15
58308972