Tengo datos donde puedo tener diferentes personas asociadas con la misma entrada.

Necesito combinar las dos entradas y notar que hay dos personas en él.

Por ejemplo, los datos pueden verse así:

Name Share_ID value1 value2 value3 etc.
Joe  0001     1      2      4
Ann  0002     2      5      2
Mel  0001     1      2      4

La salida debería ser:

Name      Share_ID value1 value2 value3 etc.
Joe, Mel  0001     1      2      4
Ann       0002     2      5      2

Traté de usar groupby

df1.groupby(['Share_ID'])['Name'].apply(', '.join).reset_index()

Pero mi resultado de eso fue solo:

Share_ID Name
0001     Joe, Mel
0002     Ann

La columna Nombre se combinó correctamente, pero perdí las otras columnas. Tenga en cuenta que no quiero que se les aplique nada a las otras columnas: los registros de Joe y Ann son idénticos.

Creo que mi enfoque está desactivado, pero no estoy segura de qué función usar.

1
RoccoMaxamas 9 oct. 2019 a las 00:19

3 respuestas

La mejor respuesta

Comenzando donde lo dejó, podría unir su conjunto de datos resultante nuevamente al DataFrame inicial:

# Find the merged name data set and rename the 'Name' column
names = df1.groupby(['Share_ID'])['Name'].apply(', '.join).reset_index().rename(columns={'Name':'Merged Name'})
# Join it to the original dataset
df1 = df1.merge(names, on='Share_ID')
# Drop the 'Name' column then drop duplicates.
df1 = df1.drop(columns=['Name']).drop_duplicates()
1
it's-yer-boy-chet 8 oct. 2019 a las 21:25

¿Alguna razón en particular para no usar los campos values en group by?

df1.groupby(['Share_ID','value1', 'value2', 'value3'])['Name'].apply(', '.join).reset_index()

Esto le dará la salida requerida.

0
mukulgarg94 8 oct. 2019 a las 21:43

Puede tomar el resultado que obtuvo, fusionarlo con el marco de datos original y soltar duplicados:

pd.merge(df1.groupby(['Share_ID'])['Name'].apply(', '.join).reset_index(), df1, on='Share_ID').drop_duplicates(subset='Share_ID')
1
Ami Tavory 8 oct. 2019 a las 21:26
58294224