Ответ 1
Индекс - это объект, а индекс по умолчанию начинается с 0
:
>>> result.index
Int64Index([0, 1, 2], dtype=int64)
Вы можете сдвинуть этот индекс на 1
с помощью
>>> result.index += 1
>>> result.index
Int64Index([1, 2, 3], dtype=int64)
Мне нужно, чтобы индекс начинался с 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 и мне интересно, существует ли более чистый путь.
Индекс - это объект, а индекс по умолчанию начинается с 0
:
>>> result.index
Int64Index([0, 1, 2], dtype=int64)
Вы можете сдвинуть этот индекс на 1
с помощью
>>> result.index += 1
>>> result.index
Int64Index([1, 2, 3], dtype=int64)
Просто установите индекс перед записью в csv. df.index = np.arange(1, len(df))
И затем напишите его как обычно.
Это сработало для меня
df.index = np.arange(1, len(df)+1)
source: В Python pandas, начинайте строку с 1 вместо нуля, не создавая дополнительный столбец
Рабочий пример:
import pandas as pdas
dframe = pdas.read_csv(open(input_file))
dframe.index = dframe.index + 1
Другой способ в одной строке:
df.shift()[1:]
Вы можете использовать это:
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
.
Вилка из оригинального ответа, дающая несколько копеек:
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
.