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.

Contar conjuntos de valores verdaderos consecutivos en una columna.

Digamos que tengo un dataframe como sigue:

df = pd.DataFrame({‘A’:[1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0,0,1,1]})

Luego, lo convierto en una forma booleana:

df.eq(1)
Out[213]:
A
0 True
1 True
2 True
3 True
4 True
5 False
6 False
7 True
8 True
9 False
10 True
11 True
12 True
13 True
14 True
15 False
16 False
17 False
18 False
19 False
20 True
21 True

Lo que quiero es contar conjuntos consecutivos de valores True en la columna. En este ejemplo, la salida sería:

df
Out[215]:
A count
0 1 5.0
1 1 2.0
2 1 5.0
3 1 2.0
4 1 NaN
5 0 NaN
6 0 NaN
7 1 NaN
8 1 NaN
9 0 NaN
10 1 NaN
11 1 NaN
12 1 NaN
13 1 NaN
14 1 NaN
15 0 NaN
16 0 NaN
17 0 NaN
18 0 NaN
19 0 NaN
20 1 NaN
21 1 NaN

Mi progreso ha sido utilizando herramientas como ‘groupby’ y ‘cumsum’, pero francamente no puedo resolverlo. Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de resolver este problema es crear una nueva columna que representa los grupos de valores True consecutivos usando la función cumsum(). Luego, agrupa el dataframe por esta nueva columna y cuenta el número de filas en cada grupo. Finalmente, utiliza la función transform() para aplicar esta cuenta a cada fila del dataframe original.

    # Convertir el dataframe a forma booleana
    bool_df = df.eq(1)
    
    # Crear una nueva columna con los grupos de valores True consecutivos
    group_col = bool_df.ne(bool_df.shift()).cumsum()
    
    # Agrupar por la nueva columna y contar el número de filas en cada grupo
    group_counts = group_col.groupby(group_col['A']).count()
    
    # Aplicar la cuenta a cada fila del dataframe original utilizando transform()
    df['count'] = group_counts.loc[group_col['A']].astype(float).transform(lambda x: None if x == 1 else x)
    

    El dataframe resultante debe tener una columna ‘count’ que representa el número de valores True consecutivos en cada grupo:

        A  count
    0   1    5.0
    1   1    2.0
    2   1    5.0
    3   1    2.0
    4   1    NaN
    5   0    NaN
    6   0    NaN
    7   1    NaN
    8   1    NaN
    9   0    NaN
    10  1    NaN
    11  1    NaN
    12  1    NaN
    13  1    NaN
    14  1    NaN
    15  0    NaN
    16  0    NaN
    17  0    NaN
    18  0    NaN
    19  0    NaN
    20  1    NaN
    21  1    NaN
    

Comments are closed.