如何将pandas DataFrame的索引数据类型更改为int32?

10

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

我尝试使用pd.DataFrame.set_indexint32的NumPy数组进行更改,还尝试使用dtype=np.int32创建新索引。但这些方法都没有奏效,返回的索引仍然是int64

有人能给出一个可行的代码来生成带有int32大小的Pandas索引吗?

我使用的是conda Pandas v0.20.1。


1
看起来好像不可能……也许我错了,但是我还没有找到方法……pd.Index(np.arange(10, dtype=np.32), dtype=np.int32) - 返回 Int64Index([...], dtype='int64') - MaxU - stand with Ukraine
好的,我也尝试了一样的方法但是也无法搞清楚。现在我试图通过查看此处的源代码 https://github.com/pandas-dev/pandas/tree/c8dafb5a7ae9fe42b9d15c47082a6fb139e78b5d/pandas/core/indexes 来寻找这个变化发生的地方,但并没有找到。 - Stanpol
我只能找到对于“数字”索引的np.int64np.uint64np.float64的支持。链接 - MaxU - stand with Ukraine
3
使用int32的目的是为了节省内存吗?索引中的值是否连续或者间隔规律?如果是,那么使用RangeIndex可能就足够了。它是Int64Index的一种特殊情况,可以节省内存,只需存储起始、结束和步长值,而无需枚举范围内的所有值。 - unutbu
1
@unutbu 是的,那就是正确答案。这正是我从核心贡献者 https://github.com/pandas-dev/pandas/issues/16404 学到的。 - Stanpol
3个回答

2

我不确定这在实践中是否值得做,但以下方法应该可行:

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

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

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

(from here)


1
在pandas 0.22.0中,这个操作并没有按预期工作。i.sort_values会将索引切成(恰好)一半。不知道为什么。i = np.arange(0, 600002, dtype=np.int32); arr = Int32Index(i, name="i"); arr2 = arr.sort_values(); print arr.shape, arr2.shape; assert arr.shape == arr2.shape - user48956

1
有人可以展示一段可用的代码来生成 int32 大小的 pandas 索引吗?可能 @PietroBattiston's answer 会起作用。但值得解释的是,为什么你通常不应该想要用 Int64/Int32 索引替换默认的 RangeIndex。 使用范围内值的逻辑比存储范围内每个整数所需的内存少。当您比较 Python 的内置 range 和 NumPy 的 np.arange 时,这应该是清楚的。如 pd.RangeIndex docs 中所述: RangeIndex 是一种节省内存的特殊情况,限于表示单调范围。在某些情况下,使用 RangeIndex 可能会提高计算速度。

1

我能找到的所有代码路径都强制转换数据类型:

请检查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)

这会改变数据类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接