Así que tengo un marco de datos de pandas que se parece a esto.

    name  is_something
0   a     0
1   b     1
2   c     0
3   c     1
4   a     1
5   b     0
6   a     1
7   c     0
8   a     1

¿Hay alguna manera de usar groupby y fusionar para crear una nueva columna que proporcione la cantidad de veces que aparece un nombre con un valor is_something de 1 en todo el marco de datos? El marco de datos actualizado se vería así:

    name  is_something no_of_times_is_something_is_1
0   a     0            3
1   b     1            1
2   c     0            1
3   c     1            1
4   a     1            3
5   b     0            1
6   a     1            3
7   c     0            1  
8   a     1            3

Sé que puede recorrer el marco de datos para hacer esto, pero estoy buscando una forma más eficiente porque el conjunto de datos con el que estoy trabajando es bastante grande. ¡Gracias por adelantado!

2
awrd2019 8 oct. 2019 a las 16:36

3 respuestas

La mejor respuesta

Si solo hay valores 0 y 1 en la columna is_something, solo use sum con GroupBy.transform para una nueva columna llena de valores agregados:

df['new'] = df.groupby('name')['is_something'].transform('sum')
print (df)
  name  is_something  new
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3

Si es posible, primero compare múltiples valores por 1, convierta a entero y luego use transform con sum:

df['new'] = df['is_something'].eq(1).view('i1').groupby(df['name']).transform('sum')
5
jezrael 8 oct. 2019 a las 13:37

Podrías hacer lo:

df['new'] = df.groupby('name')['is_something'].transform(lambda xs: xs.eq(1).sum())
print(df)

Salida

  name  is_something  new
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3
1
Dani Mesejo 8 oct. 2019 a las 13:51

O simplemente lo mapeamos

df['New']=df.name.map(df.query('is_something ==1').groupby('name')['is_something'].sum())
df
  name  is_something  New
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3
3
YOBEN_S 8 oct. 2019 a las 13:42
58287504