es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo encontrar el conteo de un valor específico en una columna de un marco de datos de pandas y utilizarlo para cálculos

Tengo un marco de datos de pandas similar al mencionado a continuación y para todos los valores únicos (Dominio) quiero calcular Count(EV)+Count(PV)+count(DV)+count(GV) donde los valores son = verde / total de valores en ese dominio único.

Dominio EV PV DV GV Numerador (parte) Denominador (parte) Resultado ideal
KA-BLR Verde Azul Verde 1 6 0.166
KA-BLR Verde Verde Azul 1 6 0.166
KL-TRV Verde Azul Amarillo Rojo 0.5 7 0.071
KL-TRV Verde Azul Azul 0.5 7 0.071
KL-COK Azul Azul Amarillo Verde 0.25 4 0.0625
TN-CHN Verde Azul 0.5 5 0.1
TN-CHN Verde Azul Amarillo 0.5 5 0.1

Código de muestra

SCORE_GLOBAL = {}
for Dominio in df_RR["Dominio"].unique():
    # contar verdes
    EV_V = (df_RR['EV'] == 'Verde').sum()
    PV_V = (df_RR['PV'] == 'Verde').sum()
    DV_V = (df_RR['DV'] == 'Verde').sum()
    GV_V = (df_RR['GV'] == 'Verde').sum()
    # contar todos los valores excluyendo los nulos
    EV = df_RR['EV'].sum()
    PV = df_RR['PV'].sum()
    DV = df_RR['DV'].sum()
    GV = df_RR['GV'].sum()
    # calcular el resultado ideal
    Numerador = (0.25 * EV_V) + (0.25 * PV_V) + (0.25 * DV_V) + (0.25 * GV_V)
    Denominador = EV + PV + DV + GV
    try:
        SCORE_GLOBAL[Dominio] = Numerador / Denominador
    except:
        SCORE_GLOBAL[Dominio] = 0
df_RR['Resultado_Global'] = df_RR['Dominio'].map(SCORE_GLOBAL)

Actualmente, esta lógica devuelve el mismo valor para todos los dominios. Por favor, ayúdame a resolverlo.

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema en el código actual es que está calculando el conteo de verdes para todos los dominios, pero no para cada dominio específico. Para resolver esto, necesitamos filtrar el data frame para cada dominio único antes de calcular el conteo de verdes.

    Podemos modificar el código de la siguiente manera:

    OVER_ALL_SCORE = {}
    for domain in df_RR["Domain"].unique():
    
       # Filtrar el data frame para el dominio actual
       df_domain = df_RR[df_RR["Domain"] == domain]
    
       # Conteo de verdes para cada columna
       EV_G = (df_domain['EV'] == 'Green').sum()
       PV_G = (df_domain['PV'] == 'Green').sum()
       DV_G = (df_domain['DV'] == 'Green').sum()
       GV_G = (df_domain['GV'] == 'Green').sum()
    
       # Conteo de todos los valores no nulos para cada columna
       EV = df_domain['EV'].count()
       PV = df_domain['PV'].count()
       DV = df_domain['DV'].count()
       GV = df_domain['GV'].count()
    
       # Calcular puntaje general para el dominio actual
       numerador = (0.25*EV_G) + (0.25*PV_G) + (0.25*DV_G) + (0.25*GV_G)
       denominador = EV + PV + DV + GV
       try:
          OVER_ALL_SCORE[domain] = (numerador / denominador)
       except ZeroDivisionError:
          OVER_ALL_SCORE[domain] = 0
    
    # Mapear puntaje general para cada dominio en el data frame original
    df_RR['Overall_score'] = df_RR['Domain'].map(OVER_ALL_SCORE)
    

    Este código actualizado debería calcular correctamente el puntaje general para cada dominio único en el data frame.

Comments are closed.