python-具有RangeIndex与Int64Index的数据框-为什么?

时间:2018-07-27 22:37:04

标签: python indexing

编辑: 我刚刚在代码中找到一行,将的df从RangeIndex更改为数字Int64Index。发生这种情况的方式和原因?

在这行之前,我所有的df均为RangeIndex类型。在这行代码之后,df_new更改为键入Int64Index,它是一个范围索引,而不是数字索引。

# remove rows with DMT, no lumninance data
df_new = df_new[df_new.Person != 'DMT']

任何人都可以解释以下内容吗?

Int64Index和RangeIndex

警告在0.18.0中已对带有浮点数的基于整数的索引进行了索引编制,有关更改的摘要,请参见此处。 Int64Index是熊猫的基本基本索引。这是实现有序可切片集合的不可变数组。在0.18.0之前,Int64Index将为所有NDFrame对象提供默认索引。 RangeIndex是在0.18.0版中添加的Int64Index的子类,现在为所有NDFrame对象提供默认索引。 RangeIndex是Int64Index的优化版本,可以表示单调有序集。这些类似于Python范围类型。“ [来自https://pandas.pydata.org/pandas-docs/stable/advanced.html#int64index-and-rangeindex]

  1. 为什么索引类型从RangeIndex更改为Int64Index?
  2. 使用具有两种不同类型的索引的数据框之间的主要或重要区别是什么? (RangeIndex和Int64Index)

    type(df_val.index)

    pandas.core.indexes.range.RangeIndex

    type(df_new.index)

    pandas.core.indexes.numeric.Int64Index

2 个答案:

答案 0 :(得分:0)

要回答#1:RangeIndex仅存储索引的开始,停止和步长值,而不是整个序列。这要求索引值之间的距离相等。当您删除某些行时,它在序列中引入了间隔,因此索引必须转换为存储所有值的类型。

关于#2:文档指出RangeIndex在某些情况下可能比Int64Index改善了计算速度。显然RangeIndex可以节省内存,但是我不确定在什么情况下它还会减少CPU时间。

答案 1 :(得分:0)

根据熊猫文档

RangeIndex 是 Int64Index 的一种节省内存的特例,仅限于表示单调范围。在某些情况下,使用 RangeIndex 可能会提高计算速度。

参数:start : int(默认值:0),或其他 RangeIndex 实例。

如果没有给出 int 和“stop”,则解释为“stop”。

停止:整数(默认值:0)

Int64Index 是带有纯整数标签的 Index 的特例。

步骤:整数(默认值:1)

参数:数据:类数组(一维)

来自我自己代码的 RangeIndex 输出:

RangeIndex(start=0, stop=4622, step=1)。在我的程序中有 4622 次观察。

Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

        ...

        934, 935, 936, 937, 938, 939, 940, 941, 942, 943],

       dtype='int64', name='user_id', length=943)

没有。观察:943