web-dev-qa-db-fra.com

démarrer l'index à 1 pour Pandas DataFrame

J'ai besoin que l'index commence à 1 plutôt qu'à 0 lors de l'écriture d'un fichier de données de données Pandas au format CSV.

Voici un exemple:

In [1]: import pandas as pd

In [2]: result = pd.DataFrame({'Count': [83, 19, 20]})

In [3]: result.to_csv('result.csv', index_label='Event_id')                               

Ce qui produit la sortie suivante:

In [4]: !cat result.csv
Event_id,Count
0,83
1,19
2,20

Mais ma sortie souhaitée est la suivante:

In [5]: !cat result2.csv
Event_id,Count
1,83
2,19
3,20

Je me rends compte que cela pourrait être fait en ajoutant une séquence d’entiers décalés de 1 sous forme de colonne à mon bloc de données, mais je suis novice en Pandas et je me demande s’il existe une méthode plus propre.

30
Clark Fitzgerald

Index est un objet et l'index par défaut commence à partir de 0:

>>> result.index
Int64Index([0, 1, 2], dtype=int64)

Vous pouvez décaler cet index de 1 avec

>>> result.index += 1 
>>> result.index
Int64Index([1, 2, 3], dtype=int64)
49
alko

Cela a fonctionné pour moi

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

Une autre façon en une ligne:

df.shift()[1:]
3
Imran

source: Dans les pandas Python, commencez l'index des lignes à partir de 1 au lieu de zéro sans créer de colonne supplémentaire

Exemple de travail:

import pandas as pdas
dframe = pdas.read_csv(open(input_file))
dframe.index = dframe.index + 1
3
Dung

Vous pouvez utiliser celui-ci:

import pandas as pd

result = pd.DataFrame({'Count': [83, 19, 20]})
result.index += 1
print(result)

ou celui-ci, en obtenant l'aide de la bibliothèque numpy comme ceci:

import pandas as pd
import numpy as np

result = pd.DataFrame({'Count': [83, 19, 20]})
result.index = np.arange(1, len(result)+1)
print(result)

np.arange va créer un tableau numpy et renvoyer des valeurs dans un intervalle donné qui est (1, len(result)+1) et vous affecterez finalement ce tableau à result.index.

0
Utku

Fourchette de la réponse originale, donnant quelques centimes:

  • si je ne me trompe pas, à partir de la version 0.23, l'objet index est de type RangeIndex

De la doc officiel :

RangeIndex est un cas spécial d'économie de mémoire de Int64Index limité à la représentation de plages monotones. Utiliser RangeIndex peut dans certains cas améliorer la vitesse de calcul.

Dans le cas d'une plage d'index énorme, cela a du sens, en utilisant la représentation de l'index, au lieu de définir l'index complet en une fois (économie de mémoire).

Par conséquent, un exemple (en utilisant Series, mais cela s’applique également à DataFrame):

>>> import pandas as pd
>>> 
>>> countries = ['China', 'India', 'USA']
>>> ds = pd.Series(countries)
>>> 
>>>
>>> type(ds.index)
<class 'pandas.core.indexes.range.RangeIndex'>
>>> ds.index
RangeIndex(start=0, stop=3, step=1)
>>> 
>>> ds.index += 1
>>> 
>>> ds.index
RangeIndex(start=1, stop=4, step=1)
>>> 
>>> ds
1    China
2    India
3      USA
dtype: object
>>> 

Comme vous pouvez le constater, l'incrément de l'objet index modifie les paramètres start et stop.

0
ivanleoncz