首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >pd.DataFrame.set_index可以管理数据类型吗?

pd.DataFrame.set_index可以管理数据类型吗?
EN

Stack Overflow用户
提问于 2018-09-10 08:16:33
回答 1查看 543关注 0票数 5

我试图以这样一种方式调用df.set_index:I set_index on列的dtype是新的index.dtype。不幸的是,在下面的示例中,set_index更改了dtype

代码语言:javascript
复制
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

类似地,

代码语言:javascript
复制
new_idx = pd.Index(np.array([-1, 0, 1, 2]), dtype=np.dtype('int8'))
assert new_idx.dtype == np.dtype('int64')

尽管dtype参数的文档说:“如果提供了一个实际的数据类型,如果它是安全的,我们就强制使用它。否则,就会引发一个错误。”

EN

回答 1

Stack Overflow用户

发布于 2018-09-10 08:49:26

尽管我在上面的评论中大肆宣扬,但这可能足以获得一个适当的索引,该索引既要占用内存,又要从-1开始。

pandas.RangeIndex

接受启动和停止参数,如range

代码语言:javascript
复制
df = df.set_index(pd.RangeIndex(-1, len(df) - 1))

print(df.index, df.index.dtype, sep='\n')

这应该是非常高效的内存。

尽管它仍然是dtype int64 (这是您应该想要的),但它占用的内存非常少。

代码语言:javascript
复制
pd.RangeIndex(-1, 4000000).memory_usage()

84

代码语言:javascript
复制
for i in range(1, 1000000, 100000):
  print(pd.RangeIndex(-1, i).memory_usage())

84
84
84
84
84
84
84
84
84
84
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52249639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档