如何将pandas DataFrame的索引dtype更改为int32?

时间:2017-05-20 21:24:41

标签: python pandas numpy indexing

DataFrame索引的默认dtype为int64,我想将其更改为int32

我尝试使用pd.DataFrame.set_index和NumPy int32数组进行更改,并尝试使用dtype=np.int32创建新索引。它没有用,总是返回int64的索引。

有人可以显示工作代码来生成int32大小的Pandas索引吗?

我使用conda Pandas v0.20.1。

3 个答案:

答案 0 :(得分:2)

不确定这是否值得在实践中做,但以下情况应该有效:

class Int32Index(pd.Int64Index):
    _default_dtype = np.int32

    @property
    def asi8(self):
        return self.values

i = Int32Index(np.array([...], dtype='int32'))

(来自here

答案 1 :(得分:1)

我找到的所有代码路径都强制执行dtype:

签入pandas.Index.__new__()

if issubclass(data.dtype.type, np.integer):
    from .numeric import Int64Index
    return Int64Index(data, copy=copy, dtype=dtype, name=name)

这允许传递dtype,但在NumericIndex().__new__()中我们有:

if copy or not is_dtype_equal(data.dtype, cls._default_dtype):
    subarr = np.array(data, dtype=cls._default_dtype, copy=copy)

更改了dtype。

答案 2 :(得分:1)

  

有人可以显示一个工作代码来生成带有int32的熊猫索引   大小?

@PietroBattiston's answer可能有效。但是值得解释一下为什么通常要用RangeIndex / Int64索引替换默认的Int32

将逻辑存储在一个值范围内比在一个范围内存储每个整数占用更少的内存。例如,将Python的内置range与NumPy np.arange进行比较时,这应该很清楚。如pd.RangeIndex docs中所述:

  

RangeIndexInt64Index有限的节省内存的特例   代表单调范围。在某些情况下使用RangeIndex   实例可以提高计算速度。