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.
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)
Cela a fonctionné pour moi
df.index = np.arange(1, len(df)+1)
Une autre façon en une ligne:
df.shift()[1:]
Exemple de travail:
import pandas as pdas
dframe = pdas.read_csv(open(input_file))
dframe.index = dframe.index + 1
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
.
Fourchette de la réponse originale, donnant quelques centimes:
RangeIndex
De la doc officiel :
RangeIndex
est un cas spécial d'économie de mémoire deInt64Index
limité à la représentation de plages monotones. UtiliserRangeIndex
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
.