栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么熊猫数据框单元格的ID每次执行都会改变?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么熊猫数据框单元格的ID每次执行都会改变?

您没有获得“单元格”的ID,而是获得

id
.loc
访问器返回的对象的ID,该访问器是基础数据的盒装版本。

所以,

>>> import pandas as pd>>> df = pd.Dataframe(columns=list('abc'), data=np.arange(18).reshape(6, 3))>>> df1 = df.iloc[:3, :]>>> df.dtypesa    int64b    int64c    int64dtype: object>>> df1.dtypesa    int64b    int64c    int64dtype: object

但是由于Python中的 所有内容 都是对象,因此您的

loc
方法必须返回一个对象:

>>> x = df.loc[0, 'a']>>> x0>>> type(x)<class 'numpy.int64'>>>> isinstance(x, object)True

但是,实际的基础缓冲区是C个固定大小的64位有符号整数的原始数组。它们不是Python对象,它们被“装箱”以从其他将原始类型与对象混合在一起的语言中借用一个术语。

现在,所有对象都具有相同现象的现象

id

>>> id(df.loc[0, 'a']), id(df.loc[0, 'a'])(4539673432, 4539673432)>>> id(df.loc[0, 'a']), id(df.loc[0, 'a']), id(df1.loc[0,'a'])(4539673432, 4539673432, 4539673432)

发生是因为在Python中,对象可以自由地重用最近回收的对象的内存地址。确实,当您创建的元组时

id
,对象的返回
loc
仅存在足够长的时间,以通过第一次调用进行传递和处理
id
,第二次使用时
loc
,已经释放的对象仅会重复使用相同的内存。您可以在任何Python对象中看到相同的行为,例如
list

>>> id([]), id([])(4545276872, 4545276872)

从根本上讲,

id
只能保证在对象的 生存期内
唯一的。在此处阅读有关此现象的更多信息。但是请注意,在以下情况下,它将始终是不同的:

>>> x = df.loc[0, 'a']>>> x2 = df.loc[0, 'a']>>> id(x), id(x2)(4539673432, 4539673408)

由于您维护引用,因此不会回收对象,并且需要新的内存。

注意,对于许多不可变的对象,解释器可以自由优化并返回 相同的精确对象 。在CPython中,“小整数”就是这种情况,所谓的小整数缓存:

>>> x = 2>>> y = 2>>> id(x), id(y)(4304820368, 4304820368)

但这是不应该依赖的实现细节。

如果您想证明自己的数据帧正在共享相同的基础缓冲区,只需对其进行突变,便会在视图之间看到相同的变化:

>>> df    a   b   c0   0   1   21   3   4   52   6   7   83   9  10  114  12  13  145  15  16  17>>> df1   a  b  c0  0  1  21  3  4  52  6  7  8>>> df.loc[0, 'a'] = 99>>> df    a   b   c0  99   1   21   3   4   52   6   7   83   9  10  114  12  13  145  15  16  17>>> df1    a  b  c0  99  1  21   3  4  52   6  7  8


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659798.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号