Pandas erro ao usar if-else para criar nova coluna: O valor de verdade de uma série é ambíguo

Estou usando o Pandas e estou tentando criar uma nova coluna usando uma instrução if-else do Python (também conhecida como operador de condição ternária) para evitar a divisão por zero.

Por exemplo abaixo, eu quero criar uma nova coluna C dividindo A / B. Eu quero usar a instrução if-else para evitar dividir por 0.

import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0, 5, size=(100, 2)), columns=list('AB')) df.head() # AB # 0 1 3 # 1 1 2 # 2 0 0 # 3 2 1 # 4 4 2 df['C'] = (df.A / df.B) if df.B > 0.0 else 0.0 

No entanto, estou recebendo um erro da última linha:

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Eu procurei no StackOverflow e encontrei outros posts sobre esse erro, mas nenhum deles envolvia esse tipo de instrução if-else. Algumas mensagens incluem:

O valor da verdade de uma série é ambíguo. Use a.empty, a.bool (), a.item (), a.any () ou a.all ()

O valor de verdade de uma série é ambíguo no dataframe

Erro: O valor de verdade de uma série é ambíguo – pandas Python

Qualquer ajuda seria apreciada.

df.B > 0 resultados em uma série, por exemplo:

 0 True # 4 > 0 => True 1 True # 2 > 0 => True 2 True # ... 3 True 4 True 5 True 6 True 7 True 8 False # 0 is not > 0 => False 9 False # 0 is not > 0 => False ... 

Vários valores são retornados, o que resulta em ambiguidade (alguns são verdadeiros, enquanto outros são falsos).

Uma solução é usar o np.where :

 sentinel = np.nan # Or 0 if you must... df = df.assign(C=np.where(df['B'] != 0, df['A'] / df['B'], sentinel)) >>> df ABC 0 2 4 0.5 1 0 2 0.0 2 1 2 0.5 3 4 4 1.0 4 1 1 1.0 5 4 4 1.0 6 2 4 0.5 7 1 2 0.5 8 4 0 NaN # NaN is assigned in cases where the value in Column `B` is zero. 9 1 0 NaN ... 

Que tal fazer

 >>> df['C'] = np.where(df.B>0., df.A/df.B, 0.) 

que lê como:

onde df.B é estritamente positivo, retorne df.A/df.B , caso contrário retorne 0.

 df['C']=df.A.div(df.B.mask(df.B.lt(0),0)).fillna(0) df Out[89]: ABC 0 1 3 0.333333 1 1 2 0.500000 2 0 0 0.000000 3 2 1 2.000000 4 4 2 2.000000 

Com aplicar lambda

 df['C']=df.apply(lambda x : x['A']/x['B'] if x['B']>0 else 0,1) df Out[93]: ABC 0 1 3 0.333333 1 1 2 0.500000 2 0 0 0.000000 3 2 1 2.000000 4 4 2 2.000000