es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    dfeditado = df[~df["join"].isna()]  # excluir filas con NaN en la columna "join"
    dfeditado = dfeditado.groupby(["join", "ParaIndex", "Chapter"], dropna=False)["text"].apply(lambda x: ' '.join(x.astype(str))).reset_index()
    dfeditado = pd.concat([df, dfeditado], sort=False)  # concatenar los dataframes original y editado
    dfeditado = dfeditado.drop_duplicates(subset=["join", "ParaIndex", "Chapter"])  # eliminar filas duplicadas
    dfeditado = dfeditado.sort_values("ID").reset_index(drop=True)  # reindexar el dataframe por "ID"
    

    Este código primero filtra las filas con NaN en la columna “join” utilizando el operador ~ y el método isna(). Luego aplica la función groupby como antes, pero solo al dataframe filtrado. El dataframe resultante se concatena con el original utilizando la función pd.concat(), manteniendo el orden de las columnas y ignorando duplicados. Finalmente, el dataframe se ordena por “ID” y se reindexa utilizando el método reset_index().

    Espero que esto ayude. Hazme saber si tienes alguna pregunta.

Comments are closed.