Tengo un conjunto de datos que se parece a la imagen de abajo,

sample data

Y mi objetivo es comparar las tres últimas filas y elegir la más alta cada vez.

Tengo cuatro nuevas variables: vacío = 0, cancelado = 0, lanzamiento = 0, indeterminado = 0

Para el índice 0, cancelCount es el más alto, por lo tanto, cancelar + = 1. Lo indeterminado se incrementa solo si las tres filas son iguales.

Aquí está mi ejemplo de código fallido:

    empty = 0 
    cancel = 0
    release = 0
    undetermined = 0
    if (df["emptyCount"] > df["cancelcount"]) & (df["emptyCount"] > df["releaseCount"]):
       empty += 1
   elif (df["cancelcount"] > df["emptyCount"]) & (df["cancelcount"] > df["releaseCount"]):
       cancel += 1
   elif (df["releasecount"] > df["emptyCount"]) & (df["releasecount"] > df["emptyCount"]):
       release += 1
   else:
       undetermined += 1

    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
0
Eniola 15 jun. 2020 a las 21:56

4 respuestas

La mejor respuesta

Puño encontramos las filas indeterminadas

equal = (df['emptyCount'] == df['cancelcount']) | (df['cancelount'] == df['releaseCount'])

Luego encontramos la columna máxima de las filas determinadas

max_arg = df.loc[~equal, ['emptyCount', 'cancelcount', 'releaseCount']].idxmax(axis=1)

Y contarlas

undetermined = equal.sum()
empty = (max_arg == 'emptyCount').sum()
cancel = (max_arg == 'cancelcount').sum()
release = (max_arg == 'releaseCount').sum()
1
badarots 15 jun. 2020 a las 19:27

Un pequeño script para obtener los valores máximos:

import numpy as np

emptyCount = [2,4,5,7,3]
cancelCount = [3,7,8,11,2]
releaseCount = [2,0,0,5,3]

# Here we use np.where to count instances where there is more than one index with the max value. 
# np.where returns a tuple, so we flatten it using "for n in m"
count = [n for z in zip(emptyCount, cancelCount, releaseCount) for m in np.where(np.array(z) == max(z)) for n in m]

empty = count.count(0) # 1
cancel = count.count(1) # 4
release = count.count(2) # 1
0
Samuel 15 jun. 2020 a las 19:24

En general, debe evitar los bucles. Aquí hay un ejemplo de código vectorizado que hace lo que necesita:

# data of intereset
s = df[['emptyCount', 'cancelCount', 'releaseCount']]

# maximum by rows
max_vals = s.max(1)

# those are equal to max values:
equal_max = df.eq(max_vals, axis='rows').astype(int)

# If there are single maximum along the rows:
single_max = equal_max.sum(1)==1

# The values:
equal_max.mul(single_max, axis='rows').sum()

La salida sería una serie que se ve así:

emmptyCount    count1
cancelCount    count2
releaseCount   count3
dtype: int64
1
Quang Hoang 15 jun. 2020 a las 19:18
import pandas as pd
import numpy as np


class thing(object):
    def __init__(self):
        self.value = 0

empty , cancel ,  release , undetermined = [thing() for i in range(4)]

dictt = {   0 : empty, 1 : cancel , 2 : release , 3 : undetermined   }

df = pd.DataFrame({
    'emptyCount': [2,4,5,7,3],
    'cancelCount': [3,7,8,11,2],
    'releaseCount': [2,0,0,5,3],   
})

for i in range(1,4):
    series = df.iloc[-4+i]
    for j in range(len(series)):
        if series[j] == series.max():
            dictt[j].value +=1

cancel.value
0
Colton Neary 15 jun. 2020 a las 19:23