web-dev-qa-db-fra.com

Dans Python pandas, commencez l'index de ligne à partir de 1 au lieu de zéro sans créer de colonne supplémentaire

Je sais que je peux réinitialiser les indices comme ça

df.reset_index(inplace=True)

mais cela démarrera l'index à partir de 0. Je veux le démarrer à partir de 1. Comment faire sans créer de colonnes supplémentaires et en conservant la fonctionnalité et les options index/reset_index? Je pas veux créer un nouveau dataframe, donc inplace=True devrait toujours s'appliquer.

23
Bram Vanroy

Attribuez simplement directement un nouveau tableau d'index:

df.index = np.arange(1, len(df) + 1)

Exemple:

In [151]:

df = pd.DataFrame({'a':np.random.randn(5)})
df
Out[151]:
          a
0  0.443638
1  0.037882
2 -0.210275
3 -0.344092
4  0.997045
In [152]:

df.index = np.arange(1,len(df)+1)
df
Out[152]:
          a
1  0.443638
2  0.037882
3 -0.210275
4 -0.344092
5  0.997045

Ou juste:

df.index = df.index + 1

Si l'index est déjà basé sur 0

HORAIRES

Pour une raison quelconque, je ne peux pas prendre de chronométrage sur reset_index mais voici les horaires sur un fichier df de 100 000 lignes:

In [160]:

%timeit df.index = df.index + 1
The slowest run took 6.45 times longer than the fastest. This could mean that an intermediate result is being cached 
10000 loops, best of 3: 107 µs per loop


In [161]:

%timeit df.index = np.arange(1, len(df) + 1)
10000 loops, best of 3: 154 µs per loop

Donc, sans le calendrier pour reset_index Je ne peux pas dire de façon définitive, mais il semble que l'ajout de 1 à chaque valeur d'index sera plus rapide si l'index est déjà 0 basé

45
EdChum

Vous pouvez également spécifier la valeur de départ en utilisant la plage d'index comme ci-dessous. RangeIndex est pris en charge dans les pandas.

#df.index

la valeur par défaut est imprimée, (start = 0, stop = lastelement, step = 1)

Vous pouvez spécifier n'importe quelle plage de valeurs de départ comme ceci:

df.index = pd.RangeIndex(start=1, stop=600, step=1)

Référer: pandas.RangeIndex

2
hakuna_code