Pandas DataFrame的起始索引为1

时间:2013-11-23 21:12:24

标签: python pandas csv dataframe indexing

在将Pandas DataFrame写入CSV时,我需要索引从1开始而不是0。

以下是一个例子:

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的新手,我想知道是否存在更清晰的方法。

9 个答案:

答案 0 :(得分:56)

索引是一个对象,默认索引从0开始:

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

您可以使用

将此索引移至1
>>> result.index += 1 
>>> result.index
Int64Index([1, 2, 3], dtype=int64)

答案 1 :(得分:9)

在写入csv之前设置索引。 df.index = np.arange(1, len(df))

然后正常写。

答案 2 :(得分:4)

来源:In Python pandas, start row index from 1 instead of zero without creating additional column

工作示例:

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

答案 3 :(得分:4)

一行中的另一种方式:

df.shift()[1:]

答案 4 :(得分:4)

这对我有用

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

答案 5 :(得分:1)

在我看来,最好的方法是使用 RangeIndex

设置索引
import pandas as pd

result = pd.DataFrame({'Count': [83, 19, 20]}, 
                      index=pd.RangeIndex(start=1, stop=4, name='index')
                     )
>>> result
       Count
index       
1         83
2         19
3         20

我更喜欢这样,因为您可以在一行中定义范围以及索引的可能 stepname

答案 6 :(得分:0)

您可以使用这个:

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将创建一个numpy数组,并在给定的时间间隔(1, len(result)+1)中返回值,最后将该数组分配给result.index

答案 7 :(得分:0)

从原始答案中分叉,得到一些美分:

  • 如果我没记错的话,从0.23版开始,索引对象是RangeIndex类型

来自official doc

  

RangeIndexInt64Index的一种节省内存的特殊情况,仅限于表示单调范围。在某些情况下,使用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对象的增量改变了startstop参数。

答案 8 :(得分:0)

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