Pandas DataFrame 的起始索引为 1

Posted

技术标签:

【中文标题】Pandas DataFrame 的起始索引为 1【英文标题】:start index at 1 for Pandas DataFrame 【发布时间】:2013-12-08 16:40:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

在写入 CSV 之前设置索引。

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

然后正常写。

【讨论】:

其中 np 是这样导入的:import numpy as np 应该是 df.index = arange( 1, len(df) + 1) 高效方式:df.index = range(1, df.shape[0] + 1)【参考方案2】:

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

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

您可以通过1 移动此索引

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

【讨论】:

它以某种方式改变了索引名称 - 所以正确的命名顺序是:df.index+=1;df.index.name='name'【参考方案3】:

来源: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

【讨论】:

【参考方案4】:

一行中的另一种方式:

df.shift()[1:]

【讨论】:

这会删除最后一行。【参考方案5】:

这对我有用

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

【讨论】:

【参考方案7】:

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

如果我没记错的话,从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】:

使用这个

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

【讨论】:

【参考方案9】:

在我看来,最好的办法是使用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

【讨论】:

【参考方案10】:

这会添加一个完成您想要的列

df.insert(0,"Column Name", np.arange(1,len(df)+1))

【讨论】:

以上是关于Pandas DataFrame 的起始索引为 1的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用iloc函数基于dataframe数据行(row)的索引抽取单行或者多行数据其中多行索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类slice函数根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间-1代表最后一个索引位置)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类使用方括号索引根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间-1代表最后一个索引位置)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类使用方括号索引根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间)

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类slice函数根据起始索引和结束索引抽取字符串内容的子字符串(左闭右开区间)

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用方括号[]基于行层索引最外侧索引的范围筛选dataframe数据(指定起始索引和结束索引)