默认的DataFrame索引dtype是int64
,我想将其更改为int32
。
我尝试使用pd.DataFrame.set_index
和int32
的NumPy数组进行更改,还尝试使用dtype=np.int32
创建新索引。但这些方法都没有奏效,返回的索引仍然是int64
。
有人能给出一个可行的代码来生成带有int32
大小的Pandas索引吗?
我使用的是conda Pandas v0.20.1。
默认的DataFrame索引dtype是int64
,我想将其更改为int32
。
我尝试使用pd.DataFrame.set_index
和int32
的NumPy数组进行更改,还尝试使用dtype=np.int32
创建新索引。但这些方法都没有奏效,返回的索引仍然是int64
。
有人能给出一个可行的代码来生成带有int32
大小的Pandas索引吗?
我使用的是conda Pandas v0.20.1。
我不确定这在实践中是否值得做,但以下方法应该可行:
class Int32Index(pd.Int64Index):
_default_dtype = np.int32
@property
def asi8(self):
return self.values
i = Int32Index(np.array([...], dtype='int32'))
(from here)
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
- user48956Int64
/Int32
索引替换默认的 RangeIndex
。
使用范围内值的逻辑比存储范围内每个整数所需的内存少。当您比较 Python 的内置 range
和 NumPy 的 np.arange
时,这应该是清楚的。如 pd.RangeIndex
docs 中所述: RangeIndex
是一种节省内存的特殊情况,限于表示单调范围。在某些情况下,使用 RangeIndex
可能会提高计算速度。我能找到的所有代码路径都强制转换数据类型:
请检查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)
这会改变数据类型。
pd.Index(np.arange(10, dtype=np.32), dtype=np.int32)
- 返回Int64Index([...], dtype='int64')
。 - MaxU - stand with Ukrainenp.int64
、np.uint64
和np.float64
的支持。链接 - MaxU - stand with Ukraineint32
的目的是为了节省内存吗?索引中的值是否连续或者间隔规律?如果是,那么使用RangeIndex
可能就足够了。它是Int64Index
的一种特殊情况,可以节省内存,只需存储起始、结束和步长值,而无需枚举范围内的所有值。 - unutbu