📚 pandas concat / merge 함수
concat과 merge는 데이터 프레임들을
결합 할 때 자주 쓰는 판다스 함수이다.
매번 쓸 때마다 기억이 않나서 찾아본다...
이번에 최대한 깔끔하게 정리해서,
개념을 좀 더 확실히 해보려고 한다.
먼저 concat과 merge의 사전적 정의를 살펴보자
concatenate : 사슬같이 잇다, 연결시키다
merge : 합병하다, 병합하다, (서로 구분이 안되게) 어우러지다
두개 다 데이터 프레임을 합치는 것은 맞지만,
concat은 주로 연결 시키는데 사용하고
merge는 합쳐서 어우러지게 한다고 생각하면 좋을 것 같다.
이제 예시를 한번 살펴보자.
💡 pd.concat
import numpy as np
import pandas as pd
np.random.seed(42)
columns = ["A","B","C","D","E"]
df1 = pd.DataFrame(np.random.randint(1,100,(10,5)), columns=columns)
df2 = pd.DataFrame(np.random.randint(1,100,(4,5)), columns=columns)
먼저 간단하게 concat 할 데이터 프레임을 만든다.
pd.concat([df1,df2],axis=0)
concat의 하이퍼 파라미터 axis를 먼저 살펴보자.
axis=0은 행의 개수가 변한다는 것을 의미한다.
위에 concat은 axis=0으로 했기 때문에 행 방향으로 연결된다,
pd.concat([df1,df2],axis=1)
그럼 당연히 axis=1은 열의 개수가 바뀌는 방향으로 간다.
df2.drop("E",axis=1,inplace=True)
pd.concat([df1,df2],join="inner")
이번에는 df2의 E 컬럼을 지워보고, join 파라미터를 사용해보자.
"inner" 는 교집합을 생각하면 된다.
교집합만 출력하기 때문에 E는 제외하고 출력한다.
pd.concat([df1,df2],join="outer")
반대로 "outer"은 합집합을 의미한다.
df2 컬럼에 "E" 가 없지만, 교집합이기 때문에
모든 컬럼이 출력된다.
💡 pd.merge
grades_data = {
'학번': [1, 2, 3, 4, 5],
'이름': ['철수', '영희', '민수', '수진', '미영'],
'과학': [90, 85, 88, 92, 95],
'수학': [85, 88, 92, 78, 90]
}
grades_df = pd.DataFrame(grades_data)
info_data = {
'학번': [1, 2, 3, 4, 6],
'성별': ['남', '여', '남', '여', '여'],
'학년': [3, 3, 2, 1, 3]
}
info_df = pd.DataFrame(info_data)
merge 연습을 위한 데이터 셋을 만들었다.
1. Left Join
pd.merge(left=grades_df,right=info_df,on="학번",how="left")
left, right는 각각 grades_df / info_df 으로,
merge 기준열은 "학번",
join 방식은 left로 왼쪽 열을 기준으로 병합된다.
따라서 grades_df (왼쪽)은 모두 출력이 되고,
info_df (오른쪽)은 "학번" 기준으로 왼쪽에 해당되는 것만 병합된다.
2. Right Join
pd.merge(left=grades_df,right=info_df,on="학번",how="right")
left join와 방식이 거의 똑같다.
다만, join 방식을 right 기준으로 한 것이다.
따라서 info_df (오른쪽) 에 있는 데이터는 모두 출력되고,
grades_df (왼쪽)은 "학번" 기준으로 오른쪽에 해당되는 것만 병합된다.
3. Inner Join
pd.merge(left=grades_df,right=info_df,on="학번",how="inner")
inner join 같은 경우에는, 양쪽에 공통으로 있는 값만 나타낸다.
위에 출력 된 값들을 보면 학번 5와 6이 출력되지 않은 것을 알 수 있다.
4. Outer Join
pd.merge(left=grades_df,right=info_df,on="학번",how="outer")
inner join 이 있으니 당연히 outer join도 있을 것이다.
outer join은 모든 값을 다 나타나도록 한다.
없는 값들은 NaN 값으로 한다.
📝마무리
데이터셋을 합치려 할 때, merge와 concat을 항상 까먹는다.
그때마다 복잡하고 어렵다는 생각이 들고는 하는데,
사실 이것보다 쉬운것도 없다 ...
'데이터 > 데이터 분석' 카테고리의 다른 글
[Python] 로또는 운일까 ? (로또 데이터 분석) - 1편. 로또 정보 수집하기 (0) | 2024.07.05 |
---|---|
파이썬 판다스 (groupby / pivot_table) (0) | 2024.03.18 |
T-test 정리 (0) | 2023.10.28 |
데이터 분석 이상치 처리 (Z-score,IQR) (1) | 2023.10.21 |
파이썬 판다스 (시리즈/데이터프레임/인덱싱/멀티인덱싱) (0) | 2023.08.22 |