데이터 분석에서 필수적인 판다스 라이브러리의 강력한 기능인 데이터 병합과 요약을 배웁니다. 이 글에서는 groupby, merge, replace 등의 기능을 사용하여 데이터를 효율적으로 처리하는 방법을 설명합니다. 데이터 분석의 효율성을 높이고 싶다면 이 글을 주목하세요.

주요내용

  • 📊 데이터 요약: groupby를 사용해 조건부 통계량을 계산하는 방법을 배웁니다.
  • 🔄 데이터 병합: mergereplace를 활용한 데이터 병합 기법을 마스터합니다.
  • 🛠 실용적인 팁: 데이터 불러오기부터 병합, 요약까지의 전 과정을 단계별로 설명합니다.

이 코드는 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) # 현재 작업 경로로 파일 로드 경로를 설정합니다.
  • 일반적으로 거래, 로그 데이터의 경우 한 회원 혹은 개체와 관련된 다양한 데이터(레코드)가 있는 경우가 많습니다.

  • 이때 일일이 레코드를 다 붙여주기도 하지만, 보통은 해당 개체를 기준으로 한 레코드들의 통계량을 붙여주는 경우가 일반적입니다.

image

  • 사용자 (ID) 가 있고, 그와 관련된 다양한 데이터 (A, B) 들이 있다고 가정

  • 머신러닝 상에서 각 세부 데이터에 대한 값이 필요한 경우라면 개별적으로 병합을 한다.

  • 하지만 보통은 ID를 기준으로 해당 데이터들을 요약해서 원래의 데이터 A에 붙이는 경우가 일반적이다.

관련 문법 : DataFrame.groupby()


  • 조건부 통계량(조건에 따른 대상의 통계량)을 계산하는 함수

  • 머신러닝, 통계 분석에서 자주 사용되는 함수

파라미터


  • by : 조건 변수(컬럼명, 혹은 리스트로 된 컬럼명들)

  • as_index : 조건 변수를 인덱스로 설정할 것인지 여부 (기본값 = True) -> 출력은 Series 타입이다.


e.g)

image

데이터 불러오기


FORMAT:

{“markdown”: “string”}

Let’s think step-by-step.

이 함수는 pd.read_csv를 사용하여 두 개의 CSV 파일을 불러옵니다. 첫 번째 파일인 고객별_인구통계정보.csv는 모집단 데이터를 포함하고 있으며, 두 번째 파일인 고객별_구매금액.csv는 병합하려는 데이터를 포함하고 있습니다. 두 파일 모두 engine 매개변수를 python으로 설정하고, encoding 매개변수를 cp949로 설정하여 한글 인코딩 문제를 해결합니다.

1
2
3
# 데이터 불러오기
pop_df = pd.read_csv("고객별_인구통계정보.csv", engine = "python", encoding='cp949') # 모집단 데이터
purchasing_df = pd.read_csv("고객별_구매금액.csv", engine = 'python', encoding='cp949') # 병합하려는 데이터

pop_df.head() 함수는 데이터프레임에서 처음 5개의 행을 반환합니다. 이 함수는 데이터의 구조를 빠르게 파악하고자 할 때 유용하게 사용됩니다.

1
pop_df.head() # 데이터프레임의 처음 5개 행을 출력합니다.

purchasing_df.head() 함수는 데이터프레임 purchasing_df의 상위 5개 행을 반환합니다. 이는 데이터셋의 구조와 초기 몇 개의 레코드를 빠르게 검토하기 위해 사용됩니다. 주석은 동일한 ID를 가진 고객이 여러 건의 구매를 할 수 있음을 나타내며, 이는 데이터셋에 중복된 ID가 존재할 수 있음을 의미합니다.

1
2
3
purchasing_df.head()

# 동일 ID를 가진 고객이 여러 건 구매를 한 데이터도 있다.

데이터 요약


  • groupby 함수에서 as_index의 기본값은 True이며, 이때 자동으로 결과물은 Series 형태로 반환됩니다.

이 함수는 purchasing_df 데이터프레임을 고객ID로 그룹화한 후, 각 고객별 구매금액의 합계를 계산합니다. 결과는 고객ID를 인덱스로 하는 새로운 데이터프레임 purchasing_aggregated_df에 저장됩니다. 이 과정을 통해 각 고객의 총 구매금액을 쉽게 파악할 수 있습니다.

1
2
3
# '고객ID'를 인덱스로 사용하여 구매금액의 합계를 계산
purchasing_aggregated_df = purchasing_df.groupby('고객ID')['구매금액'].sum()
purchasing_aggregated_df

이 함수는 purchasing_aggregated_df 데이터프레임에서 인덱스를 사용하여 특정 행에 접근합니다. 여기서 iloc[2]는 세 번째 행에 해당하는 데이터를 선택합니다. 이 데이터프레임은 고객 ID를 인덱스로 사용하며, 각 고객별로 집계된(sum) 값들을 포함합니다. 그러나 이 방식으로 데이터를 조회할 때는 고객 ID 자체는 반환되지 않습니다.

1
2
3
# 고객ID는 인덱스가 되었기 때문에 고객ID에 대응되는 sum()된 값들만 나온다.
# 고객ID는 반환되지 않는다.
purchasing_aggregated_df.iloc[2]

데이터 병합


단계별로 생각해 봅시다.

방법1 (merge 활용)


단계별로 생각해 봅시다.

두 데이터프레임을 병합하는 과정에서, 하나는 고객ID 컬럼을 사용하고 다른 하나는 인덱스를 사용합니다. pd.merge 함수는 left_on 인자를 통해 병합할 왼쪽 데이터프레임의 컬럼을 지정하고, right_index=True를 통해 오른쪽 데이터프레임의 인덱스를 병합 기준으로 사용합니다. 이 방식은 서로 다른 형태의 데이터 식별자를 가진 데이터프레임을 효율적으로 병합할 수 있게 해줍니다.

1
2
3
4
# 데이터 병합 수행
# 좌측 데이터는 고객 ID가 컬럼으로 있지만, 우측 데이터는 인덱스로 있다.
# 따라서 좌측은 left_on으로 컬럼을 명시, 우측은 right_index로 인덱스를 사용할 것을 명시해서 merge한다.
merged_df = pd.merge(pop_df, purchasing_aggregated_df, left_on = '고객ID', right_index = True)

merged_df.head() 함수는 데이터프레임에서 상위 5개 행을 반환합니다. 이는 데이터의 구조와 초기 몇 개의 값들을 빠르게 확인하기 위해 사용됩니다.

1
merged_df.head()  # 데이터프레임의 상위 5개 행을 출력합니다.

이 함수는 병합된 데이터프레임의 특정 컬럼명을 변경합니다. rename 메소드를 사용하여 columns 매개변수에 딕셔너리 형태로 원래 컬럼명('구매금액')과 새로운 컬럼명('구매금액합계')을 전달합니다. inplace=True 옵션을 설정하여 변경사항을 원본 데이터프레임에 바로 적용합니다.

1
2
3
# 병합된 데이터의 컬럼명을 이해하기 쉽도록 변경
merged_df.rename(columns = {'구매금액':'구매금액합계'}, inplace = True)
merged_df

방법 2 (replace 활용)


  • 하나의 변수만 추가해도 되는 경우는 replace를 통해 데이터 병합을 할 수도 있다.

  • 추가할 변수가 1개 이상부터는 merge를 통하는 것이 훨씬 효율적이다.


이 코드는 DataFrame 내의 특정 열의 값을 다른 데이터의 집계된 결과로 대체하는 방법을 보여줍니다. 여기서는 pop_df라는 DataFrame의 ‘고객ID’ 열의 각 값들을 purchasing_aggregated_df라는 집계된 Series 객체의 결과로 대체합니다. 이 과정에서 purchasing_aggregated_dfdict로 변환되어, 고객ID를 키로 하고 집계된 구매 금액을 값으로 하는 매핑을 제공합니다. 결과적으로, pop_df에 ‘구매금액합계’라는 새로운 열이 추가되며, 이 열에는 각 고객ID에 해당하는 구매 금액의 합계가 저장됩니다.

1
2
3
4
# 하나의 변수를 추가하는 경우에 주로 사용하는 기법은 replace를 활용하는 것입니다.
# purchasing_aggregated_df는 Series 형태이며, 이를 dict()로 변환하면 고객ID는 key, sum()된 값들은 value가 되어 replace 함수에 의해 대체됩니다.
pop_df['구매금액합계'] = pop_df['고객ID'].replace(purchasing_aggregated_df.to_dict())
pop_df

댓글남기기