我试图以这样的方式调用df.set_index
,以使set_index所在列的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
是否可以避免这种行为?我的熊猫版本是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参数的文档中指出:“如果提供了实际的dtype,我们会强制使用该dtype(如果安全)。 否则,将引发错误。”
答案 0 :(得分: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
和
keydown