我试图以这样一种方式调用df.set_index
:I set_index on列的dtype
是新的index.dtype
。不幸的是,在下面的示例中,set_index更改了dtype
。
df = pd.DataFrame({'a': pd.Series(np.array([-1, 0, 1, 2], dtype=np.int8))})
df['ignore'] = df['a']
assert (df.dtypes == np.int8).all() # fine
df2= df.set_index('a')
assert df2.index.dtype == df['a'].dtype, df2.index.dtype
有没有可能避免这种行为?我的pandas版本是0.23.3
类似地,
new_idx = pd.Index(np.array([-1, 0, 1, 2]), dtype=np.dtype('int8'))
assert new_idx.dtype == np.dtype('int64')
尽管dtype参数的文档说:“如果提供了一个实际的数据类型,如果它是安全的,我们就强制使用它。否则,就会引发一个错误。”
发布于 2018-09-10 08:49:26
尽管我在上面的评论中大肆宣扬,但这可能足以获得一个适当的索引,该索引既要占用内存,又要从-1
开始。
pandas.RangeIndex
接受启动和停止参数,如range
df = df.set_index(pd.RangeIndex(-1, len(df) - 1))
print(df.index, df.index.dtype, sep='\n')
这应该是非常高效的内存。
尽管它仍然是dtype
int64
(这是您应该想要的),但它占用的内存非常少。
pd.RangeIndex(-1, 4000000).memory_usage()
84
和
for i in range(1, 1000000, 100000):
print(pd.RangeIndex(-1, i).memory_usage())
84
84
84
84
84
84
84
84
84
84
https://stackoverflow.com/questions/52249639
复制相似问题