2016-02-20 5 views
8

Ho un problema in cui produco un dataframe di panda concatenando lungo l'asse di riga (impilando verticalmente).Panda ricalcolare l'indice dopo una concatenazione

Ciascuno dei datafram costituenti ha un indice generato automaticamente (numeri in ordine crescente).

Dopo la concatenazione, il mio indice è rovinato: conta fino a n (dove n è la forma [0] del dataframe corrispondente) e si riavvia a zero al prossimo dataframe.

Sto provando a "ricalcolare l'indice, dato l'ordine corrente", o "reindicizzare" (o almeno così pensavo). Risulta che non è esattamente quello che sembra fare DataFrame.reindex.


Ecco quello che ho cercato di fare: "non può reindicizzare da un asse duplicato"

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

non è riuscito con Non voglio modificare l'ordine dei miei dati ... ho solo bisogno di cancellare il vecchio indice e di crearne uno nuovo, con l'ordine delle righe preservato.

risposta

12

Dopo concatenazione verticale, se si ottiene un indice di [0, n) seguito da [0, m), tutto quello che dovete fare è chiamare reset_index:

train_df.reset_index(drop=True) 

(si può fallo sul posto usando inplace=True).


import pandas as pd 

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

Questo dovrebbe funzionare:

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

Impostare drop-True per evitare una colonna aggiuntiva nella vostra dataframe.

13

Se l'indice viene generato automaticamente e non si vuole tenerlo, è possibile utilizzare l'opzione ignore_index. `

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

Ciò AutoGenerate un nuovo indice per voi, e la mia ipotesi è che questo è esattamente ciò che siete dopo.

+1

Questo è più diretto di '.reset_index (drop = True)' e quindi preferisco IMO, ma la denominazione è un po 'meno chiara – Dmitri