두 변수가 동일한 pandas 객체를 참조하는지 확인하는 방법은 무엇입니까?

Nov 15 2020

이 예에서 r1과 r2는 동일한 객체를 참조하지만 assert(not r1 is r2)ID가 다르기 때문에 false를 반환합니다. 그러나 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

이것이 발생하는 이유에 대한 설명 은 numpy의 배열 슬라이싱에서 찾을 수 있습니다.

답변

1 Ch3steR Nov 15 2020 at 14:24

IIUC, np.may_share_memory또는 np.shares_memory여기를 사용할 수 있습니다.

np.may_share_memory(r1, r2)
# True
1 meTchaikovsky Nov 15 2020 at 14:24

먼저, 저를보기 위해 간단한 실험을 할 수 있도록 r1하고 r2실제로 동일한 개체 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

이것은 에서 동일한 객체를 의미 r1하고 r2간주합니다 pandas.

실제로이 스크립트를 실행하면

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에 따르면 이 게시물 에서 Monica의 의견을 지원합니다.

받은 ID가 배열 요소의 주소와 관련이 없다고 생각합니다. 배열 메타 데이터를 포함하는 헤더의 주소와 요소에 사용되는 저장소에 대한 포인터입니다.

기본적 r1r2같은 배열 요소를 참조하여 다른 물체이다.