두 변수가 동일한 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가 배열 요소의 주소와 관련이 없다고 생각합니다. 배열 메타 데이터를 포함하는 헤더의 주소와 요소에 사용되는 저장소에 대한 포인터입니다.
기본적 r1
과 r2
같은 배열 요소를 참조하여 다른 물체이다.