pd.DataFrame.set_index可以保留dtype吗?

时间:2018-09-10 00:16:33

标签: python pandas

我试图以这样的方式调用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(如果安全)。     否则,将引发错误。”

1 个答案:

答案 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