Estoy tratando de filtrar filas desde un marco de datos aplicando una máscara con un montón de declaraciones lógicas como esta:

mask = ( (stock_hist['confirmed'] == True and \
         stock_hist['prevday_confirmed'] == False and \
             stock_hist['nextday_confirmed'] == False \
                 ) \
       or  \
       ( stock_hist['confirmed'] == True and \
        stock_hist['prevday_confirmed'] == True and \
            stock_hist['current_dist'] < stock_hist['prevday_dist'] ) \
           or \
           ( \
            stock_hist['confirmed'] == True and \
            stock_hist['nextday_confirmed'] == True and \
                stock_hist['current_dist'] < stock_hist['nextday_dist'] \
                    ) \
               
or \
    ( stock_hist['confirmed'] == True and \
    stock_hist['nextday_confirmed'] == True and \
        stock_hist['prevday_confirmed'] == True and \
            stock_hist['current_dist'] < stock_hist['nextday_dist'] and \
                stock_hist['current_dist'] < stock_hist['prevday_dist'] \
                    ) \
        )

result = stock_hist[mask]

Con esto, recibo el temido mensaje de error 'ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()., que ya ha sido respondido en numerosas ocasiones.

La cuestión es que cada una de las condiciones da como resultado Falso o Verdadero para la fila, y necesito que cualquiera de ellas sea verdadera, para que la máscara devuelva 'Verdadero' para esa fila. Así que me encantaría poner una máscara. Cualquier () más o menos allí ...

Sin embargo, no tengo idea de cómo hacer eso?

Cualquier ayuda es muy apreciada!

0
Tristan 24 jun. 2020 a las 10:05

2 respuestas

En lugar de and y or, debe usar & y |, respectivamente. Algo como:

( (stock_hist['confirmed'] & \
         ~(stock_hist['prevday_confirmed']) & \
             ~(stock_hist['nextday_confirmed'])  \
                 ) \
       |  \
       ( stock_hist['confirmed']...

Esto se debe a que está trabajando con series y desea que se comparen los elementos correspondientes. Si usa and, todos los elementos se comparan como un grupo, por lo que es ambiguo.

0
Mohit Motwani 24 jun. 2020 a las 07:33

Debe usar todas sus condiciones entre paréntesis de la siguiente manera

mask = ((stock_hist['confirmed'] == True) and \
         (stock_hist['prevday_confirmed'] == False) and \
             (stock_hist['nextday_confirmed'] == False) \
                 ) \
        ...

result = stock_hist[mask]
0
Alihan ÖZ 24 jun. 2020 a las 07:14