Pandas recalculan el índice después de una concatenación

2 minutos de lectura

Tengo un problema en el que produzco un marco de datos de pandas mediante la concatenación a lo largo del eje de la fila (apilamiento vertical).

Cada uno de los marcos de datos constituyentes tiene un índice generado automáticamente (números ascendentes).

Después de la concatenación, mi índice está jodido: cuenta hasta n (donde n es la forma[0] del marco de datos correspondiente), y se reinicia en cero en el siguiente marco de datos.

Estoy tratando de “volver a calcular el índice, dado el orden actual”, o “volver a indexar” (o eso pensé). Resulta que eso no es exactamente lo que DataFrame.reindex parece estar haciendo.


Esto es lo que traté de hacer:

train_df = pd.concat(train_class_df_list)
train_df = train_df.reindex(index=[i for i in range(train_df.shape[0])])

Falló con “no se puede volver a indexar desde un eje duplicado”. No quiero cambiar el orden de mis datos… solo necesito eliminar el índice anterior y configurar uno nuevo, conservando el orden de las filas.

Si su índice se genera automáticamente y no desea conservarlo, puede utilizar el ignore_index opción. `

train_df = pd.concat(train_class_df_list, ignore_index=True)

Esto generará automáticamente un nuevo índice para usted, y supongo que esto es exactamente lo que está buscando.

  • Esto es más directo que .reset_index(drop=True) y por lo tanto IMO preferible, pero el nombre es algo menos claro

    – Dmitri

    25/06/2016 a las 18:35


  • ¡Funciona mejor! ¡Gracias!

    – ambiguo9

    26 de agosto de 2020 a las 0:26

  • Extrañamente, esto no funciona para mí. Se ejecuta sin generar un error, pero para cada archivo concatenado, la indexación comienza desde 0

    – NeStack

    5 abr a las 11:22

Avatar de usuario de Ami Tavory
ami sabroso

Después de la concatenación vertical, si obtiene un índice de [0, n) followed by [0, m), all you need to do is call reset_index:

train_df.reset_index(drop=True)

(you can do this in place using inplace=True).


import pandas as pd

>>> pd.concat([
    pd.DataFrame({'a': [1, 2]}), pd.DataFrame({'a': [1, 2]})]).reset_index(soltar=Verdadero) a 0 1 1 2 2 1 3 2

Esto debería funcionar:

train_df.reset_index(inplace=True, drop=True) 

Establecer soltar a True para evitar una columna adicional en su marco de datos.

¿Ha sido útil esta solución?