Tengo tres columnas la mesa se ve así:

ID.   names     tag
1.     john.     1
2.     sam       0
3.    sam,robin. 1
4.     robin.    1

Id: tipo entero Nombres: tipo cadena Etiqueta: tipo entero (solo 0,1)

Lo que quiero es encontrar cuántas veces se repite cada nombre agrupado por 0 y 1. Esto se debe hacer en Python.

La respuesta debe verse como

               0                 1
John           23                12
Robin          32                10
sam            9                 30
2
Kathan Vyas 16 oct. 2018 a las 22:47

2 respuestas

La mejor respuesta

Usando extractall y crosstab:

s = df.names.str.extractall(r'(\w+)').reset_index(1, drop=True).join(df.tag)

pd.crosstab(s[0], s['tag'])
tag    0  1
0
john   0  1
robin  0  2
sam    1  1
4
user3483203 16 oct. 2018 a las 20:14

Debido a la naturaleza de su columna names, es necesario volver a procesar antes de poder obtener recuentos de valores. En el caso de su marco de datos de ejemplo, esto podría verse más o menos así:

my_counts = (df.set_index(['ID.', 'tag'])
             # Get rid of periods and split on commas
             .names.str.strip('.').str.split(',')
             .apply(pd.Series)
             .stack()
             .reset_index([0, 1])
             # rename column 0 for consistency, easier reading
             .rename(columns={0: 'names'})
             # Get value counts of names per tag:
             .groupby('tag')['names']
             .value_counts()
             .unstack('tag', fill_value=0))

>>> my_counts
tag    0  1
names      
john   0  1
robin  0  2
sam    1  1
2
sacuL 16 oct. 2018 a las 19:57