이 글에서는 판다스 라이브러리를 사용하여 데이터를 효율적으로 병합하고 처리하는 방법을 알아봅니다. 참조 데이터를 활용한 데이터 변환부터 병합까지의 전 과정을 단계별로 설명합니다. 데이터 분석에 필수적인 판다스 기능을 마스터하세요.
주요내용
- 📊 판다스 라이브러리의 기본 사용법 소개
- 🔑 참조 데이터를 활용한 데이터 변환 방법
- 🔄 데이터 병합 과정과 관련된 다양한 기법
이 코드는 os
와 pandas
라이브러리를 임포트하고, Python에서 발생할 수 있는 불필요한 경고 메시지를 필터링하여 생략합니다. 또한, 현재 작업 중인 디렉토리의 경로를 얻어와서 이를 파일 로드 경로로 설정합니다. 이를 통해 사용자는 현재 작업 중인 디렉토리 내의 파일을 쉽게 접근하고 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
import os
import pandas as pd
# 불필요한 경고 표시를 생략합니다.
import warnings
warnings.filterwarnings(action = 'ignore')
a=%pwd # 현재 작업 경로를 변수 a에 할당합니다.
os.chdir(a) # 현재 작업 경로로 파일 로드 경로를 설정합니다.
참조 데이터가 필요한 경우
-
도로명 주소, 지번주소, 회원명, 회원 번호 등의 데이터는 보통
일정한 패턴
이 없고, 포맷도 다른 경우가 많다. -
이런 경우
참조 데이터
를 활용해서 변경한 뒤 merge를 하여 데이터 병합을 할 수 있다.
e.g) 병합하고자 하는 데이터의 key값이 다른 경우
- a, b, c라고 되어있는 key값을 참조데이터를 활용해 각각 1, 2, 3으로 변경한 뒤에 merge를 진행한다.
관련 문법 1 : Series.to_dict()
-
Series의 index를 Key로, Data를 Value로 하는 dict형태로 변환해주는 함수
-
replace 등 사전을 입력받는 함수를 사용할 때 주로 사용하는 함수입니다.
-
index와 Data가 매칭되는 점을 유의해야 합니다.
-
일반적으로 참조 데이터를 불러올 때, data의 type가 Series가 아니라 DataFrame인 경우가 있습니다.
-
이 경우 DataFrame에서 index와 Data를 설정해준 뒤에 dict로 바꿔줘야 합니다.
-
관련 문법 2 : Series.replace()
-
dict를 입력받아, Series 내에 있는 요소 가운데 key와 같은 값을 value로 변환해주는 함수
-
‘S’ 라는 데이터의 value들을 변환해야 하는데, 아래 그림과 같은 dict를 replace()에 입력해주면, 이를 참조해서 값이 변경된다.
- 만약, ‘S’ 데이터에 ‘e’라는 값이 있다면 (dict에는 ‘e’에 대한 참조 데이터가 없다), 이때의 결과값은 a~d는 dict가 반영된 위의 그림과 같이 결과가 나오고, e는 기존 S에 있던 값이 그대로 나오게 된다.
참조데이터를 통한 merge 실습
2011년 ‘군’이었던 것들이 ‘시’로 변경되어 데이터에 이를 적용하고자 할 때
팁. 데이터를 로드할 때, 원본 파일이 열려있으면 ‘Permission denied’라고 경고가 뜰 수 있습니다.
이 문서는 pandas
라이브러리를 사용하여 CSV와 Excel 파일에서 데이터를 불러오는 방법을 설명합니다. pd.read_csv
함수는 CSV 파일을 읽어서 DataFrame
객체로 반환합니다. 이 때, encoding
파라미터를 사용하여 파일의 인코딩을 지정할 수 있습니다. Excel 파일에서는 pd.read_excel
함수를 사용하여 데이터를 불러옵니다. sheet_name
파라미터를 통해 특정 시트의 데이터만 선택적으로 불러올 수 있으며, 여기서는 2020년과 2011년 데이터를 각각 불러오는 예시를 보여줍니다.
1
2
3
4
5
6
7
8
# 데이터 불러오기
# read_csv로 불러온 파일은 항상 'DataFrame' 이다.
ref_df = pd.read_csv("시승격정보.csv", encoding = "cp949") # 참고할 데이터
# sheet_name 파라미터를 활용해 특정 sheet의 값만 불러올 수도 있다.
df1 = pd.read_excel("인구수데이터.xlsx", sheet_name = "202006") # 2020년 데이터
df2 = pd.read_excel("인구수데이터.xlsx", sheet_name = "201108") # 2011년 데이터
변수 ref_df
는 데이터 프레임을 참조합니다. 이 변수는 특정 데이터 분석이나 처리 과정에서 사용될 수 있으며, 데이터 프레임의 이름을 통해 데이터에 접근하거나 조작하는 데 사용됩니다.
1
ref_df
본 문서는 특정 코드 블록에 대한 설명을 제공하지 않습니다. 따라서, 구체적인 함수, 변수, 또는 클래스에 대한 설명을 제공할 수 없습니다.
1
# df1에 대한 설명이나 주석을 추가할 코드가 없습니다.
1
Series 형태로 type 변경
-
reference 데이터가 데이터 프레임 형태이기 때문에 to_dict()하기 위해 Series형태로 변경시켜줘야 합니다.
-
Series의 index가 key가 되고, data가 value가 되도록 해야 합니다 -> set_index를 활용해 ‘승격전’ 컬럼을 인덱스로 설정
이 함수는 ref_df
데이터프레임에서 '승격전'
컬럼을 인덱스로 설정하고, '승격후'
컬럼의 데이터를 선택하여 Series 객체를 반환합니다. set_index
메서드를 사용하여 인덱스를 재설정하며, 이 과정을 통해 특정 컬럼의 값을 기반으로 새로운 Series 객체를 생성합니다.
1
2
3
# index가 승격전이고, 데이터가 승격후인 Series
# '승격전' 컬럼을 인덱스로 설정하기 위해 set_index를 활용
ref_df.set_index('승격전')['승격후']
인덱스 자료를 기반으로 대응되는 ‘승전후’ 값을 dict 형태로 바꿔줍니다.
이 함수는 ref_df
데이터프레임에서 ‘승격전’ 열을 인덱스로 설정하고, ‘승격후’ 열의 값을 이용하여 딕셔너리(ref_dict
)를 생성합니다. 결과적으로, ‘승격전’의 값들이 키가 되고, ‘승격후’의 값들이 해당 키의 값이 되는 딕셔너리가 만들어집니다.
1
2
# 인덱스 설정 및 시리즈를 딕셔너리로 변환
ref_dict = ref_df.set_index('승격전')['승격후'].to_dict()
본 코드는 df2
데이터프레임에서 ‘행정구역’ 열을 선택하는 작업을 수행합니다. 이때, ‘행정구역’ 열에는 지역의 행정 구분이 ‘군’으로 표기되어 있음을 주석으로 명시합니다.
1
df2['행정구역'] # 행정구역이 '군'으로 표기되어 있다.
ref_dict을 이용하여 키 변수 값 변환
단계별로 생각해 봅시다.
이 함수는 df2
의 ‘행정구역’ 열에 있는 값을 ref_dict
를 사용하여 교체합니다. 교체 작업 후, ‘행정구역’ 열의 값이 업데이트됩니다. 예를 들어, 특정 행정구역명이 ‘시’로 변경될 수 있습니다. 이 과정은 2011년의 행정구역명을 2020년의 행정구역명으로 매핑하는 데 사용됩니다.
1
2
3
4
# 2011년의 행정구역명(df2)을 ref_dict를 참조하여 2020년의 행정구역명(df1)으로 교체합니다.
df2['행정구역'] = df2['행정구역'].replace(ref_dict)
df2['행정구역']
# 행정구역명이 '시'로 변경됩니다.
merge
- df1과 df2에 있는
변수명이 모두 같으므로
, 두 연도간의 데이터를 구분하기 위해 변수명 변경을 해줄 필요가 있다.
데이터프레임 df1
과 df2
에서 행정구역
열을 인덱스로 설정합니다. inplace=True
파라미터는 해당 변경사항을 원본 데이터프레임에 바로 적용함을 의미합니다.
1
2
df1.set_index("행정구역", inplace = True) # 행정구역을 인덱스로 설정
df2.set_index("행정구역", inplace = True) # 행정구역을 인덱스로 설정
add_prefix() 함수로 데이터 구분하기
-
모든 컬럼에 접두사를 붙여주는 add_prefix() 함수를 활용해 2020년 데이터와 2011년 데이터를 구분해줍니다.
-
add_prefix()를 쓰면 ‘모든 컬럼에 일괄적용’ 되기 때문에 merge()에 활용할 ‘행정구역’은 index화 시켜 영향을 받지 않게 하였습니다.
데이터프레임의 컬럼명 앞에 특정 문자열을 추가하기 위해 add_prefix
메서드를 사용합니다. 이 예제에서는 df1
의 모든 컬럼명 앞에 "202006_"
을 추가하고, df2
의 모든 컬럼명 앞에 "201108_"
을 추가합니다. 이 방법은 데이터를 로드할 때 각 데이터프레임의 출처나 날짜 등을 식별하기 위한 접두사(prefix)를 컬럼명에 쉽게 추가할 수 있게 해줍니다.
1
2
3
4
5
# 데이터프레임의 컬럼명 앞에 특정 문자열을 추가
# df1의 모든 컬럼명 앞에 '202006_'을 추가
# df2의 모든 컬럼명 앞에 '201108_'을 추가
df1 = df1.add_prefix("202006_")
df2 = df2.add_prefix("201108_")
두 데이터 프레임 df1
과 df2
를 병합하는 과정에서, 각 데이터 프레임의 인덱스를 병합 기준으로 사용하기 위해 pd.merge
함수의 left_index
와 right_index
매개변수에 True
값을 설정합니다. 이 방식은 인덱스를 기준으로 두 데이터 프레임을 병합할 때 사용됩니다.
1
2
# 각각의 데이터 프레임의 인덱스를 key 인덱스로 사용하기 위해 left_index = True, right_index = True를 적용
merged_df = pd.merge(df1, df2, left_index = True, right_index = True)
merged_df.head()
함수는 데이터프레임에서 처음 다섯 행을 반환합니다. 이는 데이터의 구조와 초기 몇 개의 값들을 빠르게 검토하기 위해 사용됩니다.
1
merged_df.head() # 데이터프레임의 처음 다섯 행을 출력합니다.
댓글남기기