【问题标题】:How to check if two variables refers to the same pandas object?如何检查两个变量是否引用同一个熊猫对象?
【发布时间】:2021-02-26 16:34:16
【问题描述】:

在这个例子中,r1 和 r2 指的是同一个对象,但assert(not r1 is r2) 返回 false,因为它们的 id 不同。但是,我希望它会失败,因为 r1 和 r2 指的是同一个对象!

import pandas as pd
df = pd.DataFrame([0])
r1 = df.iloc[0]
r2 = df.iloc[0]
assert(not r1 is r2)
r1[0] = 1
assert(r1.equals(r2))
print(id(r1), id(r2))
>> 140547055257416 140547055258032

可以在array slicing in numpy 中找到关于为什么会发生这种情况的解释

【问题讨论】:

  • 使用“.copy()”。至于为什么看stackoverflow.com/questions/27673231/…
  • 我想你误解了我的问题。我已经改写了。
  • 对不起,这将回答您的问题。 stackoverflow.com/questions/47972633/…
  • 一个有趣的阅读,但它没有告诉我如何检查两个变量是否引用同一个熊猫对象。
  • 您可以称其为错误,但您是否想要一个 dict 保存您所做的每个 iloc 操作以便得到相同的 ID?

标签: python pandas


【解决方案1】:

您可以在此处使用np.may_share_memorynp.shares_memory

np.may_share_memory(r1, r2)
# True

【讨论】:

  • shared memoryis 的主要区别是什么?
【解决方案2】:

首先我们做一个简单的实验,看看r1r2实际上是pandas意义上的同一个对象

import pandas as pd

df = pd.DataFrame([0,1,2,3])
r1 = df.iloc[:,:1]
r2 = df.iloc[:,:1]

r1.iloc[2] = -10
r2.iloc[1] = -100
assert (not r1 is r2)

print(pd.concat((df,r1,r2),axis=1).to_string())

运行这个脚本,输出是

     0    0    0
0    0    0    0
1 -100 -100 -100
2  -10  -10  -10
3    3    3    3

这意味着r1r2pandas 视为同一个对象。

其实就是通过运行这个脚本

unique_ids = []
for _ in range(1000):
    one_id = id(df.iloc[:,:1])
    unique_ids.append(one_id)
set(unique_ids)

你会看到set(unique_ids)的长度不是1!!

根据@user2357112支持莫妮卡在this post下的评论

我认为您收到的 ID 与数组元素的地址没有任何关系;它是包含数组元数据的标头的地址和指向用于元素的存储的指针。

基本上,r1r2 是引用相同数组元素的不同对象。

【讨论】:

  • 你没有回答就说明了我的问题。您表明 r1 r2 被认为是同一个对象,但 id 不同。
  • @Chuan 看我更新的帖子,我猜r1r2 是包含数组元数据的标头。
  • 感谢您的详细解释。我将 Ch3steR 的答案标记为正确,因为它回答了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2017-01-20
  • 1970-01-01
  • 2012-11-21
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多