Saltar al contenido

¿Cómo contar la aparición de valores en un marco de datos de pandas si los valores para contar están en otro (de una manera más rápida)?

Luego de consultar con especialistas en este tema, programadores de diversas ramas y profesores hemos dado con la respuesta a la cuestión y la compartimos en esta publicación.

Solución:

puedes hacerlo con interior merge para filtrar las combinaciones en df que no quieres, entonces groupby edad y sexo y count la columna contando. simplemente reset_index para que se ajuste a su salida esperada.

freq = (df.merge(freq, on=['age', 'gender'], how='inner')
          .groupby(['age','gender'])['counting'].size()
          .reset_index())
print (freq)
   age gender  counting
0   10      F         2
1   10      M         1
2   20      F         1

Dependiendo de la cantidad de combinaciones que no desee, podría ser más rápido groupby en df antes de hacer el merge me gusta:

freq = (df.groupby(['age','gender']).size()
          .rename('counting').reset_index()
          .merge(freq[['age','gender']])
       )

Otra forma es usar reindex para filtrar a la lista de frecuencias:

df.groupby(['gender', 'age']).count()
  .reindex(pd.MultiIndex.from_arrays([df1['gender'], df1['age']]))

Producción:

            country
gender age         
F      10         2
M      10         1
F      20         1

NumPy en la mezcla para alguna actuación (¡con suerte!) con la idea de reducción de dimensionalidad para 1Dpara que podamos traer el eficiente bincount -

agec = np.r_[df.age,freq.age]
genderc = np.r_[df.gender,freq.gender]
aIDs,aU = pd.factorize(agec)
gIDs,gU = pd.factorize(genderc)
cIDs = aIDs*(gIDs.max()+1) + gIDs
count = np.bincount(cIDs[:len(df)], minlength=cIDs.max()+1)
freq['counting'] = count[cIDs[-len(freq):]]

Ejecución de muestra -

In [44]: df
Out[44]: 
  country  age gender
0  Brazil   10      F
1     USA   20      F
2  Brazil   10      F
3     USA   20      M
4  Brazil   10      M
5     USA   20      M

In [45]: freq # introduced a missing element as the second row for variety
Out[45]: 
   age gender  counting
0   10      F         2
1   23      M         0
2   20      F         1

Optimización de escenarios específicos #1

Si age se sabe que el encabezado contiene solo números enteros, podemos omitir uno factorize. Entonces, salta aIDs,aU = pd.factorize(agec) y calcular cIDs en cambio con -

cIDs = agec*(gIDs.max()+1) + gIDs

Recuerda que puedes dar difusión a esta división si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.