데이터 분석 TIL - 파이썬 데이터 결합(merge, concat, pivot table, rrule, strftime)

테리·2025년 11월 17일

1. 학습 키워드

파이썬 데이터 결합

  • merge
  • concat
  • pivot table
  • rrule, strftime

2. 학습 내용

🔥🔥Merge

SQL의 join과 유사. 공통 컬럼을 기준으로 테이블 병합.

주요옵션(파라미터)

  • on: 조건 컬럼(한개 or 여러개)
  • how: 어떤 조인 방식을 사용할 것인지(inner, outer, left, right)
  • sort: 병합 후 인덱스 정렬 여부(True/False)
  • suffixes: 중복된 컬럼 이름 처리 방법 설정
  • indicator: True로 할 경우 마지막 열에 병합 정보를 출력함.

1) 기본 코드
: df3의 Customer ID는 출력되지 않는다.

merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')

2) 공통 컬럼이 2개 이상일 때

merge_df = pd.merge(df2, df3, how='inner', on=['공통컬럼1','공통컬럼2'])

3) 기준열 이름이 다를 때
: df3의 Customer ID가 df2의 컬럼명과 겹쳐 컬럼명이 변경되서 나옴.

merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')

4) 공통 컬럼을 개별로 출력하고 싶을 때
: 겹치는 컬럼명이 있으면 suffixes로 설정한 대로 출력됨.

merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_rihgt'))

join

인덱스 기준으로 테이블을 병합. 사용 거의 안함.

# join 방식 설정
df2.join(df3, how='right')

# join시 이름이 같은 컬럼이 있을 경우 반드시 문자열 지정해야함.
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)

🔥🔥concat

여러 데이터프레임 or 시리즈를 특정 축을 따라 연결

  • axis=0: 수직 결합(기본값), axis=1(수평결합)

ex)

# 가로로 결합
pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')


axis = 1으로 했으면 가로로 결합이됨. 그렇기 때문에 ignore_index=True를 사용하면 세로축의 인덱스가 재정렬 되는 것이 아니라 가로 컬럼값이 숫자로 재정렬됨.

🔥🔥pivot table

내가 원하는 컬럼들로 새로운 데이터프레임을 만들고 계산할 수 있음.

  • index: 인덱스(축)로 사용될 열
  • columns: 열로 사용될 열
  • values: 값으로 사용될 열
  • values에 리스트를 입력할 경우 각 값에 대한 테이블이 연속적으로 생성된다.
  • aggfunc: 어떤 계산을 할지
    • sum, mean, std(표준편차), count, nunique(중복제거 개수), max, min
  • fill_value: NaN 값을 처리하고 싶을 때 사용. fill_value=0
  • dropna: 결측치 삭제 여부 결정
  • sort: index or columns 기준으로 정렬

ex)

# age, Category 라는 축을 기준으로 성별 Previous Purchases 최소, 최대값 구하기 
pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])

lambda

함수를 한번만 사용하거나 인자로 전달해야하는 경우에 사용함.

ex)

# lambda 함수를 이용한 홀수 출력하기 
mylist = [1, 2, 3, 4, 5]

mylist2 = list(filter(lambda x: x % 2 == 1, mylist))
print(mylist2)

# lambda 함수를 이용한 정렬
mylist = ['apple', 'banana', 'cherry']
mylist2 = sorted(mylist, key=lambda x: len(x))
print(mylist2)

split

문자열 나눌때 사용함.

inline if
: 만족했을 때 결과값 if 조건 만족 못했을 때 결과값.

for i in range(7):
    df2["명수{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)

apply()가 df['x']의 행을 위에서부터 차례대로 내려가면서 lambda 함수를 적용함. 명수0, 명수1, ~ 명수6

rrule

dateutil 라이브러리에 속한 함수로 날짜 데이터를 원하는 기준에 따라 output으로 가져올 수 있음.

주요옵션

  • freq : 반복 주기를 나타내는 파라미터로, SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY
  • dtstart: 반복이 시작하는 날짜와 시간을 나타냅니다.
  • interval: 주기적으로 반복되는 간격을 나타냅니다.
  • count: 생성할 날짜의 최대 수를 나타냅니다.
  • until: 반복이 끝나는 날짜와 시간을 나타냅니다.

ex)

weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)

🔥데이터프레임에서 특정 날짜기간에 해당하는 데이터만 슬라이싱 할때 사용함.

1) 내가 원하는 날짜를 만듬

# 2023-02-01 부터 2023-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력.
from datetime import datetime
from dateutil.rrule import rrule, DAILY

# 시작 날짜, 종료날짜
start_date = datetime(2023, 2, 1)
end_date = datetime(2023, 3, 1)

daily_rule = rrule(DAILY, dtstart=start_date, until=end_date)
# 빈 리스트 생성 후 날짜를 담아주기
a=[]
for date in daily_rule:
    a.append(date.strftime('%Y-%m-%d'))

a의 결과는 ['2023-02-01', '2023-02-02', ..., '2023-03-01']

2) 내가 보려고 하는 df3에서 날짜를 필터링

# df3 에 있는 날짜 데이터는 string 
# string -> datetime -> string 의 형태로 변환
# 위에서 받은 리스트에 해당하는 데이터만 필터링하기 위함 
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp'], format='%d/%m/%Y %H:%M').dt.strftime('%Y-%m-%d')

mask =(df3['Time stamp2'].isin(a))
# a 날짜에 속하면 True 아니면 False 형태로 나옴.

3) df3에 마스크를 씌움

3. 배운점

  1. merge와 concat의 사용법을 배우면서 중요하고 사용되는 함수이기에 기본적인 사용법을 외우고 있으면 좋다는 것을 알 수 있었다. 특히나 merge 후에 컬럼명이 어떻게 나오는지, concat의 ignore_index가 세로 인덱스를 정렬하는 건줄 알았는데 axis 설정 값에 따라 가로축 컬럼명을 새롭게 정렬할 수 있다는 것을 알게 되었다.
  2. rrule은 처음 접하는 라이브러리였다. 꿀팁처럼 알고 있으면 좋을 것 같다.

0개의 댓글