Unir filas con el mismo índice y mantener las demás filas sin cambios.
Tengo este marco de datos:
df =
ID join Chapter ParaIndex text
0 NaN 1 0 Soy una prueba
1 NaN 2 1 es fácil
2 1 3 2 pero no tanto
3 1 3 3 muy fácil
Quiero obtener esto:
(fusionar la columna “texto” con el mismo índice en la columna “join” y reindexar “ID” y “ParaIndex”, el resto sin cambios)
dfEditado =
ID join Chapter ParaIndex text
0 NaN 1 0 Soy una prueba
1 NaN 2 1 es fácil
2 1 3 2 pero no tanto muy fácil
Usé este comando:
dfEditado = df.groupby(['join'])['text'].apply(lambda x: ' '.join(x.astype(str))).reset_index()
Solo fusiona la fila con el índice numérico en la columna “join” y excluye la fila con un índice no numérico.
Entonces cambié a esto:
dfEditado = df.groupby(['join'], dropna=False)['text'].apply(lambda x: ' '.join(x.astype(str))).reset_index()
Aquí se fusionan todas las filas basadas en el índice “join”, pero considera la fila con el índice NaN como un grupo, y también las fusiona. Sin embargo, no quiero fusionarlas… ¿alguna idea? Muchas gracias.
También probé esto:
dfEditado = df.groupby(['join', "ParaIndex", "Chapter"], dropna=False)['text'].apply(lambda x: ' '.join(x.astype(str))).reset_index()
Se ve mejor ya que tiene todas las columnas, pero no hay cambios.
davy.ai
Para obtener el resultado deseado donde los valores NaN en la columna “join” no se incluyen en el agrupamiento, puedes filtrar esas filas antes de aplicar la función groupby. Aquí está el código modificado:
Este código primero filtra las filas con NaN en la columna “join” utilizando el operador
~
y el métodoisna()
. Luego aplica la función groupby como antes, pero solo al dataframe filtrado. El dataframe resultante se concatena con el original utilizando la funciónpd.concat()
, manteniendo el orden de las columnas y ignorando duplicados. Finalmente, el dataframe se ordena por “ID” y se reindexa utilizando el métodoreset_index()
.Espero que esto ayude. Hazme saber si tienes alguna pregunta.