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.
3 respuestas
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()
¿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.
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')