Calcular el porcentaje de valores agrupados específicos

1

Tengo un marco de datos:

id       is_good
a1        1
a1        1
a1        0
bb        1
bb        0
bb        0
bb        0
с1        0
с1        0
d2        1
d2        1

Como puede ver, hay casos en los que el valor de id solo tiene el tipo is_good. Quiero contar el porcentaje de 0 y 1 para cada identificación. Y si el valor de identificación solo tiene el tipo de is_good, el tipo que no tiene debe ser 0 por ciento. Lo mismo con d2. Entonces el resultado deseado es:

id       is_good_perc
a1        0.67
bb        0.25
с1        0
d2        1      

¿Como hacer eso? La parte complicada para mí es el caso con id c1 y d2.

Intenté esto:

.groupby("id").is_good.value_count(normalize=True)

pero no crea 0 para c1 y d2

5
  • ¿No debería a1serlo 0.5?
    Jab
    13 de oct a las 18:11
  • @Jab no hay dos 1 y un 0, por lo que es 2/3 13 oct a las 18:12
  • df.groupby (df.id) .mean () 13 de oct a las 18:49
  • @JosephDoun dice DataError: No numeric types to aggregate 14 de oct a las 14:11
  • @french_fries, entonces sus columnas "is_good" son de tipo cadena. Tienes que convertirlo en int o float. por ejemplo, df ['is_good'] = df ['is_good']. astype (int). Mire la salida de df.info (). 15 oct a las 12:42
0

Agrupar df.is_goodpor df.idluego dividir la suma por el número de:

>>> grouped = df['is_good'].groupby(df.id)
>>> df1 = pd.DataFrame(grouped.sum() / grouped.count()).round(2).rename(columns={'is_good': 'is_good_perc'})
>>> df1 
    is_good_perc
id              
a1          0.67
bb          0.25
d2          1.00
с1          0.00
1
  • trae este error TypeError: solo se puede concatenar str (no "int") a str 14 de oct a las 14:09