수업(국비지원)/Python
[Python] 얕은 복사, 깊은 복사
byeolsub
2023. 4. 25. 11:27
💡
얕은 복사(immutable, mutable 객체의 복사)
- 얕은 복사란 변수를 복사했다고 생각하지만 실제로는 연결 되어 있는 것이다. 변수를 복사했지만 참조한 곳(메모리주소)은 동일하여, 같은 변수를 가리키고있는것.
- '='으로 대입해서 얕은복사 ⇒ 참조만 복사. 같은 리스트(메모리주소)참조.
- ‘[:]’ 으로 리스트의 처음과 끝까지 전체를 슬라이싱을 이용한 얕은 복사. ⇒ 전체 리스트 주소는 다르지만 리스트 내부가 참조하는 주소는 동일. 얕은복사와 깊은복사의 사이. 원본의 내부 리스트에 요소값추가하면 내부적인 참조값 주소는 동일하여 복사본의 내용도 복사된다.(얕은복사 pandas에서는 깊은복사)
깊은 복사 : 두개의 객체가 다른 객체
- pandas모듈의 DataFrame.copy(deep=True) copy()함수 방식 (copy모듈 따로있음. 이 경우 import copy해야 사용가능) </aside>
📌 얕은 복사(immutable, mutable 객체의 복사)
# 데이터 프레임 복사하기
df2 = df # 얕은 복사. df,df2는 동일한 객체임
df2.info()
df

# df 데이터의 홍길동 인덱스를 홍길순으로 변경하기
df.rename(index={"홍길동":"홍길순"},inplace=True)
df
df2 # 두개의 데이터 프레임 객체가 같은 객체임을 확인

📌
#1 [:] 범위 지정 방식. 전체영역
df3 = df[:]
# df 데이터의 홍길동 인덱스를 홍길순으로 변경하기
df.rename(index={"홍길순":"홍길동"},inplace=True)
df
df3

# drop() : 행, 열 제거
# axis=0 : 행을 의미
# axis=1 : 열을 의미
# 행을 제거
df3.drop(["홍길순"],axis = 0, inplace=True)
df3
# 열을 제거
df3.drop(["체육"],axis = 1, inplace=True)
df3
# 열 제거하기
del df3["음악"]
df3



📌 깊은 복사
# 깊은 복사
#2 copy() : 깊은 복사 Pandas모듈사용 방식
df4 = df.copy()
df4
# df4에서 음악, 체육 제거하기
#1
del df4["음악"],df4["체육"]
#2
df4.drop(["음악","체육"],axis=1,inplace=True)
df4
# df 데이터의 수학, 영어 컬럼 조회하기
df[["수학","영어"]] # 주의 하자. [[]]
df["수학","영어"] # 오류발생.
# df 데이터의 수학 컬럼 조회하기
df["수학"] # Series 객체.
df[["수학"]] # DataFrame 객체
# df 데이터의 이몽룡 학생 점수 조회하기
df.loc["이몽룡"] # 인덱스 이름
df
df.iloc[1] # 순서조회
# df 데이터의 이몽룡, 김삿갓 학생 점수 조회하기
df.loc[["이몽룡","김삿갓"]] # 인덱스 이름
df.iloc[[1,2]] # 순서 조회
# 범위로 조회하기
df.loc["이몽룡":"김삿갓"] # 인덱스 범위 조회. 이몽룔부터 김삿갓 까지
df.loc["이몽룡":] # 이몽룡부터 끝까지
df.loc[:"이몽룡"] # 처음부터 이몽룡까지
df.loc[:] # 처음부터 끝까지
df.loc[::] # 처음부터 끝까지 2칸씩 조회. 이몽룡은 나오지 않음
df.loc[::-1] # 처음부터 끝까지 역순으로 조회
df.iloc[1:3] # 순서 조회 : 1번부터 3번앞에 까지 조회
df.iloc[1:] # 1번부터 끝까지
df.iloc[:2] # 처음부터 2번앞에 까지
df.iloc[:] # 처음부터 끝까지
df.iloc[::] # 처음부터 끝까지 2칸씩 조회. 이몽룡은 나오지 않음
df.iloc[::-1] # 처음부터 끝까지 역순으로 조회
# 이몽룡의 수학, 영어 점수 조회하기
#1 Series 객체
df.loc["이몽룡"][["수학","영어"]]
#2
df.loc["이몽룡",["수학","영어"]]
#3 DataFrame 객체
df.loc[["이몽룡"],["수학","영어"]]
#4 DataFrame 객체
df.loc[["이몽룡"]][["수학","영어"]]
#5
df.loc["이몽룡"].iloc[:2]
df[:] # 컬럼만으로 조회.
df.loc[:,:] # df.loc[행의 범위,열의 범위]