이 글에서는 판다스 라이브러리를 사용하여 데이터를 효율적으로 병합하고 처리하는 방법을 알아봅니다. 참조 데이터를 활용한 데이터 변환부터 병합까지의 전 과정을 단계별로 설명합니다. 데이터 분석에 필수적인 판다스 기능을 마스터하세요.

주요내용

  • 📊 판다스 라이브러리의 기본 사용법 소개
  • 🔑 참조 데이터를 활용한 데이터 변환 방법
  • 🔄 데이터 병합 과정과 관련된 다양한 기법

이 코드는 ospandas 라이브러리를 임포트하고, 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를 하여 데이터 병합을 할 수 있다.


image


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()에 입력해주면, 이를 참조해서 값이 변경된다.

image


  • 만약, ‘S’ 데이터에 ‘e’라는 값이 있다면 (dict에는 ‘e’에 대한 참조 데이터가 없다), 이때의 결과값은 a~d는 dict가 반영된 위의 그림과 같이 결과가 나오고, e는 기존 S에 있던 값이 그대로 나오게 된다.

참조데이터를 통한 merge 실습

2011년 ‘군’이었던 것들이 ‘시’로 변경되어 데이터에 이를 적용하고자 할 때

image


팁. 데이터를 로드할 때, 원본 파일이 열려있으면 ‘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에 있는 변수명이 모두 같으므로, 두 연도간의 데이터를 구분하기 위해 변수명 변경을 해줄 필요가 있다.

데이터프레임 df1df2에서 행정구역 열을 인덱스로 설정합니다. 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_")

두 데이터 프레임 df1df2를 병합하는 과정에서, 각 데이터 프레임의 인덱스를 병합 기준으로 사용하기 위해 pd.merge 함수의 left_indexright_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() # 데이터프레임의 처음 다섯 행을 출력합니다.

댓글남기기