2016-02-20 12 views
8

Mam problem, w którym produkuję pandasową ramkę danych, łącząc się wzdłuż osi wiersza (układając pionowo).Pandy ponownie obliczają indeks po konkatenacji

Każda ze składowych ramek danych ma automatycznie generowany indeks (numery rosnące).

Po konkatenacji indeks jest pomijany: zlicza do n (gdzie n jest kształtem [0] odpowiedniej ramki danych) i rozpoczyna się ponownie od zera w następnej ramce danych.

Próbuję "ponownie obliczyć indeks, biorąc pod uwagę obecną kolejność" lub "ponownie indeksować" (lub tak myślałem). Okazuje się, że to nie jest dokładnie to, co wydaje się robić DataFrame.reindex.


Oto, co starałem się zrobić "Nie można reindex od osi duplikatu"

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

To nie powiodło się Nie chcę zmieniać kolejności moich danych ... wystarczy usunąć stary indeks i skonfigurować nowy, z zachowaną kolejnością wierszy.

Odpowiedz

12

Po pionowym konkatenacji, jeśli masz indeks [0, n) następnie [0, m), wszystko co musisz zrobić to zadzwonić reset_index:

train_df.reset_index(drop=True) 

(można zrób to na miejscu, używając 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

To powinno działać:

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

Ustaw drop do True aby uniknąć dodatkowej kolumny w swojej dataframe.

13

Jeśli indeks jest wygenerowany automatycznie i nie chcesz, aby ją utrzymać, można skorzystać z opcji ignore_index. `

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

Będzie autogenerować nowy indeks dla ciebie, i wydaje mi się, że to jest dokładnie to, czego po.

+1

To jest bardziej bezpośrednie niż '.reset_index (drop = True)' i tym samym IMO jest lepsze, ale nazewnictwo jest nieco mniej jasne – Dmitri

Powiązane problemy