【问题标题】:How to change index dtype of pandas DataFrame to int32?如何将 pandas DataFrame 的索引 dtype 更改为 int32?
【发布时间】:2017-10-20 19:37:02
【问题描述】:

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

我尝试使用pd.DataFrame.set_indexint32 的NumPy 数组更改它,还尝试使用dtype=np.int32 创建新索引。它不起作用,总是返回int64的索引。

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

我使用 conda Pandas v0.20.1。

【问题讨论】:

  • 这似乎不可能...我可能错了,但我还没有找到方法...pd.Index(np.arange(10, dtype=np.32), dtype=np.int32) - 返回Int64Index([...], dtype='int64')
  • 好吧,我也做了同样的事情,但想不通。现在尝试在这里查看源代码github.com/pandas-dev/pandas/tree/…,但看不到这种变化发生在哪里。
  • 使用int32的目的是为了节省内存吗?索引中的值是连续的还是规则间隔的?如果是这样,那么 RangeIndex 可能就足够了。这是Int64Index 的一个节省内存的特例。它通过仅存储开始、停止和步进值而不枚举范围内的所有值来节省内存。
  • @unutbu 是的,这是正确的答案。这正是我从核心贡献者github.com/pandas-dev/pandas/issues/16404 那里学到的。

标签: python pandas numpy indexing


【解决方案1】:

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

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

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

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

(来自here

【讨论】:

  • 在 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
【解决方案2】:

我能找到的所有代码路径,强制 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。

【讨论】:

    【解决方案3】:

    有人可以展示一个工作代码来生成带有 int32 的 pandas 索引吗 尺寸?

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

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

    RangeIndexInt64Index limited 的一个节省内存的特例 来表示单调范围。在某些情况下使用RangeIndex 实例提高计算速度。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2015-01-16
      • 2022-01-10
      • 2018-10-14
      • 2021-07-20
      • 2012-11-19
      • 2018-01-18
      相关资源
      最近更新 更多