Подтвердить что ты не робот

начальный индекс с 1 для Pandas DataFrame

Мне нужно, чтобы индекс начинался с 1, а не с 0 при записи Pandas DataFrame в CSV.

Вот пример:

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')                               

Который производит следующий вывод:

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

Но мой желаемый результат:

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

Я понимаю, что это можно сделать, добавив последовательность целых чисел, сдвинутых на 1 в виде столбца, к моему фрейму данных, но я новичок в Pandas и мне интересно, существует ли более чистый путь.

4b9b3361

Ответ 1

Индекс - это объект, а индекс по умолчанию начинается с 0:

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

Вы можете сдвинуть этот индекс на 1 с помощью

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

Ответ 2

Просто установите индекс перед записью в csv. df.index = np.arange(1, len(df))

И затем напишите его как обычно.

Ответ 3

Это сработало для меня

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

Ответ 5

Другой способ в одной строке:

df.shift()[1:]

Ответ 6

Вы можете использовать это:

import pandas as pd

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

или этот, получая помощь библиотеки numpy как это:

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 создаст пустой массив и вернет значения в заданном интервале (1, len(result)+1) и, наконец, вы назначите этот массив для result.index.

Ответ 7

Вилка из оригинального ответа, дающая несколько копеек:

  • если я не ошибаюсь, начиная с версии 0.23, индексный объект имеет тип RangeIndex

Из официального документа:

RangeIndex - это особый случай экономии памяти Int64Index ограниченный представлением монотонных диапазонов. Использование RangeIndex может в некоторых случаях повысить скорость вычислений.

В случае огромного диапазона индекса это имеет смысл, используя представление индекса вместо определения всего индекса сразу (экономия памяти).

Таким образом, пример (с использованием Series, но это относится и к 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
>>> 

Как видите, приращение index объекта меняет параметры start и stop.