pd.concat()
pd.concat([english_df1, english_df2], ignore_index=True)
# ignore_index: index값을 합친 데이터 기준으로 재설정
pd.concat([english_df, math_df], axis=1)
# axis=1: 컬럼을 기준으로 합침
예제
2020년부터 2022년까지 3년 간의 월별 매출액 데이터를 한 번에 모아서 보려고 합니다. 각 연도의 데이터는 sales_2020, sales_2021, sales_2022라는 변수에 각각 저장되어 있는데요. 세 개의 DataFrame을 하나로 합쳐서 sales_df라는 변수에 저장해 주시면 됩니다.
import pandas as pd
sales_2020_df = pd.read_csv('data/sales_2020.csv')
sales_2021_df = pd.read_csv('data/sales_2021.csv')
sales_2022_df = pd.read_csv('data/sales_2022.csv')
sales_df = pd.concat([sales_2020_df, sales_2021_df, sales_2022_df])
sales_df
결과값
조인 연산
merge()
: 보다 다양한 옵션을 사용할 수 있다
pd.merge(employee_df, survey_df, on='id', how='left', suffixes=('_left', '_right'))
# employee_df: 병합할 첫 번째 데이터프레임
# surbey_df: 병합할 두 번째 데이터프레임
# on='id': 두 데이터프레임을 병합할 때 기준이 되는 열 이름을 지정
# how='left': 병합의 방법을 지정
# 'left'는 왼쪽 데이터프레임(employee_df)의 모든 행을 포함하고, 오른쪽 데이터프레임(surbey_df)의 해당하는 값을 추가하는 방식
# 만약 오른쪽 데이터프레임에 일치하는 값이 없다면, 결과에 NaN으로 채워진다.
# suffixes=('_left', '_right'): 만약 두 데이터프레임에 같은 이름의 열이 있을 경우, 충돌을 피하기 위해 각 데이터프레임의 열 이름에 접미사를 추가함
# 왼쪽 데이터프레임의 같은 열 이름에는 _left를, 오른쪽 데이터프레임의 같은 열 이름에는 _right를 붙임
pd.merge(employee_df, survey_df, left_on='id', right_on='employee_id')
# employee_df: 병합할 첫 번째 데이터프레임입니다.
# survey_df: 병합할 두 번째 데이터프레임입니다.
# left_on='id': 첫 번째 데이터프레임(employee_df)의 병합 기준 열을 지정
# employee_df의 'id' 열을 기준으로 병합합니다.
# right_on='employee_id': 두 번째 데이터프레임(survey_df)의 병합 기준 열을 지정
# 이 경우, survey_df의 'employee_id' 열을 기준으로 병합
예제
소행성 정보를 담고 있는 asteroid_df와 각 소행성이 속한 궤도 관련 정보를 담고 있는 orbit_df를 하나로 합쳐서, 각 소행성이 지구와 충돌할 위험이 있는지 확인하려고 합니다. 두 데이터를 inner join한 결과물을 nasa_df라는 변수에 저장해 주세요.
import pandas as pd
asteroid_df = pd.read_csv('data/asteroid.csv')
orbit_df = pd.read_csv('data/orbit.csv')
nasa_df = pd.merge(asteroid_df, orbit_df, left_on='id', right_on='asteroid_id')
nasa_df
결과값
'인덱스'로 데이터 합치기
import pandas as pd
# 두 데이터 모두 사원 번호가 인덱스로 설정되어 있는 상태라고 가정
employee_df = pd.read_csv('data/employee.csv', index_col='id')
survey_df = pd.read_csv('data/survey.csv', index_col='id')
# left_index라는 값을 True로 설정하면 왼쪽 데이터에 있는 인덱스를 키 값으로 사용하고
# right_index라는 값을 True로 설정하면 오른쪽 데이터에 있는 인덱스를 키 값으로 사용
pd.merge(employee_df, survey_df, left_index=True, right_index=True)
참고로 둘 중 하나만 True로 설정하는 것도 가능하다. 예를 들어 left_index만 True로 설정하면 왼쪽 데이터만 인덱스를 키 값으로 사용하고, 오른쪽 데이터는 특정 컬럼을 키 값으로 사용하게 되는데, 이때, 반드시 right_on 옵션을 함께 사용해서 어떤 컬럼을 키 값으로 할 건지 정해 줘야 한다.
반대로 right_index만 True로 설정할 땐, left_on 옵션을 함께 사용해주어야 한다.
join()
: 인덱스가 키 값으로 설정되었을 때 좀 더 간결한 코드로 데이터를 합칠 수 있다.
employee_df.join(survey_df, lsuffix='_x', rsuffix='_y')
# employee_df: 병합할 첫 번째 데이터프레임
# survey_df: 병합할 두 번째 데이터프레임
# survey_df가 employee_df에 인덱스 기준으로 병합됩니다.
# lsuffix='_x': 왼쪽 데이터프레임(employee_df)에 있는 열 중 이름이 충돌하는 경우, 왼쪽 데이터프레임의 열 이름에 추가할 접미사를 설정
# 여기서는 _x가 접미사로 추가됨
# rsuffix='_y': 오른쪽 데이터프레임(survey_df)에 있는 열 중 이름이 충돌하는 경우, 오른쪽 데이터프레임의 열 이름에 추가할 접미사
# 여기서는 _y가 접미사로 추가됨
예제
asteroid_df와 orbit_df에서 소행성 번호가 저장되어 있는 컬럼을 각각 인덱스로 설정해 놨다고 합시다. join() 함수를 가지고 두 데이터를 inner join한 결과물을 nasa_df라는 이름의 변수에 저장해 주세요.
import pandas as pd
asteroid_df = pd.read_csv('data/asteroid.csv', index_col='id')
orbit_df = pd.read_csv('data/orbit.csv', index_col='asteroid_id')
nasa_df = asteroid_df.join(orbit_df, how='inner')
nasa_df
'컬럼명'으로 데이터 합치기
employee_df.join(survey_df, on='id', rsuffix='_x')
# employee_df 데이터의 id 컬럼과 survey 데이터의 인덱스를 기준으로 조인 연산을 수행
# 이때 주의할 점은 왼쪽 데이터만 인덱스와 컬럼 중에서 자유롭게 키 값을 선택할 수 있고,
# 오른쪽 데이터는 인덱스만 키 값으로 사용할 수 있다
# 데이터에 공통적으로 department라는 컬럼이 있으므로 오류가 나지 않게 rsuffix 값도 설정한다