Quiero si las condiciones son verdaderas si df[df["tg"] > 10 y df[df["tg"] < 32 entonces multiplicar por cinco de lo contrario dividir por dos. Sin embargo, me sale el siguiente error
ValueError: el valor de verdad de un DataFrame es ambiguo. Use a.empty, a.bool(), a.item(), a.any() o a.all().
d = {'year': [2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001], 'day': [1, 2, 3, 4, 1, 2, 3, 4,], 'month': [1, 1, 1, 1, 2, 2, 2, 2], 'tg': [10, 11, 12, 13, 50, 21, -1, 23], 'rain': [1, 2, 3, 2, 4, 1, 2, 1]} df = pd.DataFrame(data=d) print(df) [OUT] year day month tg rain 0 2001 1 1 10 1 1 2001 2 1 11 2 2 2001 3 1 12 3 3 2001 4 1 13 2 4 2001 1 2 50 4 5 2001 2 2 21 1 6 2001 3 2 -1 2 7 2001 4 2 23 1 df["score"] = (df["tg"] * 5) if ((df[df["tg"] > 10]) and (df[df["tg"] < 32])) else (df["tg"] / 2) [OUT] ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().Lo que quiero
year day month tg rain score 0 2001 1 1 10 1 5 1 2001 2 1 11 2 55 2 2001 3 1 12 3 60 3 2001 4 1 13 2 65 4 2001 1 2 50 4 25 5 2001 2 2 21 1 42 6 2001 3 2 -1 2 0.5 7 2001 4 2 23 1 46Utilice np.where :
# do you need `inclusive=True`? Expected output says yes, your logic says no mask = df['tg'].between(10,32, inclusive=False) df['score'] = df['tg'] * np.where(mask, 5, 1/2) # or # df['score'] = np.where(mask, df['tg'] * 5, df['tg']/2)Producción:
year day month tg rain score 0 2001 1 1 10 1 5.0 1 2001 2 1 11 2 55.0 2 2001 3 1 12 3 60.0 3 2001 4 1 13 2 65.0 4 2001 1 2 50 4 25.0 5 2001 2 2 21 1 105.0 6 2001 3 2 -1 2 -0.5 7 2001 4 2 23 1 115.0Puedes usar where :
df['score'] = (df['tg']*5).where(df['tg'].between(10, 32), df['tg']/5)Intentemos arreglarlo con bucle for
[x * 5 if (x > 10 and x < 32) else (x / 2) for x in df['tg']] Out[64]: [5.0, 55, 60, 65, 25.0, 105, -0.5, 115]Puedes usar df.loc
mask = (df["tg"] > 10) & (df["tg"] < 32) df.loc[mask, "score"] = df["tg"] * 5 df.loc[~mask, "score"] = df["tg"] / 2Para obtener una explicación más detallada de su mensaje de error, eche un vistazo a esto en los documentos de los pandas.
Otra opción, además de las ya excelentes respuestas, es la función case_when de pyjanitor , que podría ser una abstracción útil, especialmente para múltiples condiciones, o probablemente necesite conservar los tipos de extensión de Pandas:
# pip install git+https://github.com/pyjanitor-devs/pyjanitor.git import pandas as pd import janitor df.case_when( df.tg.gt(10) & df.tg.le(32), # condition df.tg.mul(5), # result if True df.tg.div(2), # result if False column_name='score') year day month tg rain score 0 2001 1 1 10 1 5.0 1 2001 2 1 11 2 55.0 2 2001 3 1 12 3 60.0 3 2001 4 1 13 2 65.0 4 2001 1 2 50 4 25.0 5 2001 2 2 21 1 105.0 6 2001 3 2 -1 2 -0.5 7 2001 4 2 23 1 115.0Más ejemplos se pueden encontrar aquí