예제로 익히는 Python - 2회차

Suhyeon Lee·2024년 10월 23일
0

라이브 세션

목록 보기
9/37

목표

  • python 데이터 병합 방식을 이해
    • 데이터 == 테이블
  • pivot table 을 이해하고 실습
  • 그 외 유용한 메서드를 숙지하고 dataset 에 적용

Python 데이터 결합

  • Python에서 UNION, JOIN 하기

Merge ★★★

  • pandas 의 함수 중 하나
  • 공통컬럼을 기준으로 테이블을 병합
  • SQL 구문의 JOIN 과 가장 유사

주요 옵션(파라미터)

  • on
    • 조건 컬럼이 한 개인지 여러 개인지
    • left on / right on
      • 열 기준 병합 시 기준으로 할 열의 양측 이름이 다른 경우 각각 어떤 열을 기준으로 할 지 지정
  • how
    • 어떤 조인 방식을 사용할 것인지
    • inner, outer, left, right
  • sort
    • 병합 후 인덱스 정렬 여부(True/False)
  • surffixes
    • 중복된 컬럼 이름의 처리
      • 공통 컬럼을 개별로 출력하고 싶을 대 사용
        suffixes=('_left','_right')
  • indicator
    • True 로 할 경우, 마지막 열에 병합 정보를 출력

문법

# 기본 작성구문으로, 디폴트값은 inner join
# 공통컬럼값은 합쳐져 하나의 컬럼으로 출력
merge_df = pd.merge(df2,df3)

# 위 코드와 동일한 기능입니다. on 절을 사용할 수 있어요. 
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')

# 공통컬럼이 2개 이상일 때
merge_df = pd.merge(df2, df3, how='inner', on=['공통컬럼1','공통컬럼2'])

# 기준열 이름이 다를 때
merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')

# 공통컬럼을 개별로 출력하고 싶을 때
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_right'))

merge할 때 키를 작성하지 않으면 기본적으로 두 데이터프레임에서 동일한 이름을 가진 모든 열(column)을 기준으로 병합돼요!
공통된 열이 있을 경우 그 열을 자동으로 병합의 기준으로 합쳐주는데, 공통된 열이 없으면 오류가 발생할 수 있습니다.

Join ★★

  • pandas 의 함수 중 하나

  • 인덱스 기준으로 테이블을 병합

    • 인덱스 == 축
      - 인덱스는 모든 데이터프레임에 존재할 수밖에 없으니 무조건 조인이 되겠지용
  • 인덱스 기준으로 다양한 옵션을 통해 조인을 할 수 있음

    • Python join과 SQL join 헷갈리지 마세요
      • Python join: 인덱스 기준 병합
      • SQL join: 공통 컬럼 기준 병합
      • Python merge: 공통 컬럼 기준 병합
  • 잘 쓰지 않음

    • join이 할 수 있는 일을 merge가 다 할 수 있기 때문!

주요 옵션

  • how
    • 어떤 조인 방식을 사용할 것인지
    • inner, outer, left, right
  • lsuffix / rsuffix
    • 이름이 같은 컬럼이 있을 경우, 문자열 지정하여 부여
  • sort
    • 인덱스 정렬여부(True / False)

문법

# 단순 조인
df2.join(df3)

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

# join시 이름이 같은 컬럼이 있을 경우, 옵션으로 설정하여 조인 가능
df.join(df2) # 오류 → 이름이 같은 컬럼이 있으면 안 됨
df.join(df2,how='left', lsuffix='1', rsuffix='2')

# join 이후, 인덱스 정렬하기
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)

Concat ★★★

  • pandas의 함수 중 하나
  • 여러 데이터프레임 또는 시리즈를 특정 축을 따라 연결하는 데 사용
  • 활용 예시
    • 월별 매출 → concat으로 한번에 합치기

주요 옵션

  • axis
    • 수직결합인지, 수평결합인지
      • axis=0: 수직결합(기본값)
      • axis=1: 수평결합
  • join
    • 어떤 조인 방식을 사용할 것인지
    • inner, outer, left, right
  • join_axes
    • 조인 축 지정
  • keys
    • 데이터프레임 축이름 지정
  • ignore_index=True
    • 인덱스 재배열
  • 디폴트 결합 방식
    • outer join (합집합)

문법

# 기본 작성구문
pd.concat([df2, df3])

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

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

append ★

  • pandas 의 함수 중 하나
  • 데이터프레임에 행을 추가하는 메서드
  • 두 데이터프레임을 행 기준으로 결합

주요 옵션

  • ignore_index
    • 기존 인덱스를 사용할지 여부
    • False로 할 경우 0,1,2,..,n 부여
  • sort
    • 열을 사전적으로 정렬할 지 여부

문법

# 단순 결합, 없는 건 NaN으로 처리되고 결합
# df2 가 df 의 아래로 붙음

df.append(df2)

Merge 와 Join 의 차이점

구분MergeJoin
결합 기준컬럼을 기준으로 두 데이터프레임을 결합(보다 유연성이 높습니다.)인덱스를 기준으로 두 데이터프레임을 결합
응용결합의 기준이 되는 컬럼을 지정결합의 기준이 되는 컬럼을 지정할 수도 있고, 인덱스를 기준으로 결합할 수도 있음
사용법판다스 Library 의 함수 중 하나로, 두 데이터프레임을 input 값으로 받습니다.기준이 되는 dataframe의 메서드 형태로 호출되며, 결합할 테이블 1개를 인자로 받습니다.

Concat 과 Append의 차이점

구분ConcatAppend
결합 기준수직, 수평결합 모두 가능수직결합만 가능

Pivot Table

  • 엑셀의 피봇 테이블을 파이썬에서 실행해봐요!

Pivot Table

  • 데이터의 열을 기준으로 피벗테이블로 변환시키는 함수
  • 데이터 가공 및 시각화를 위해, 데이터프레임을 자유롭게 변환 가능
    • 내가 원하는 컬럼들로 새로운 데이터프레임을 만들고, 이를 계산까지 할 수 있음

주요 옵션

  • index
    • 인덱스(축) 으로 사용될 열
  • columns
    • 열로 사용될 열
  • values
    • 값으로 사용될 열
  • aggfunc
    • 어떠한 계산을 하는지
집계 함수코드
합계aggfunc =’sum’
평균aggfunc = ‘mean’
표준편차aggfunc = 'std’
갯수aggfunc = 'count’
갯수(중복제거)aggfunc = 'nunique’
최대값aggfunc = ‘max’
최소값aggfunc = ‘min’
  • fill_value

    • NaN 값을 처리하고 싶을 때 사용, fill_value=0 이 가장 많이 사용됨
  • dropna

    • 결측치(na) 삭제 여부 결정
  • sort

    • index or columns 기준으로 정렬
  • 열로 리스트 형태가 입력될 경우

    • index 및 columns → 멀티 인덱스 기반 피벗테이블 생성
    • values → 각 값에 대한 테이블이 연속적으로 생성

문법

# age 라는 축을 기준으로 카테고리별 고객id 카운트 
pd.pivot_table(df2, index='Age', columns='Category', values='Customer ID', aggfunc='count')
# age, Category 라는 축을 기준으로 성별 Previous Purchases 최소, 최대값 구하기 
pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])
agecategorygendergender
20대장난감Previous Purchases(min)Previous Purchases(max)
20대의류
# 성별을 축으로 하고, 사이즈, 나이별 고객id 고유하게 카운트 
pd.pivot_table(df2, index=['Gender'],columns=['Size','Age'], values='Customer ID', aggfunc='nunique')

그 외 유용한 메서드 소개

  • Python 의 함수는 끝이 없어요!

lambda

  • 람다 함수는 이름이 없는 함수
  • 일반적으로 함수를 한 번만 사용하거나 함수를 인자로 전달해야 하는 경우에 매우 유용하게 사용

표현식

# 1.기본 표현구문
lambda 매개변수 : 표현식
------------------------------------------------
#2.이해하기
들어온 값에 2를 곱해서 반환한다면 lambda x : x * 2  
------------------------------------------------
#3.기존 함수 작성방식과 비교하기 
#두 수를 더하는 함수
def plus(a,b):
	return a+b
plus(10,40)
>> 50

#두 수를 더하는 함수 - 람다 형식
(lambda a,b: a + b)(10, 40)

응용

# 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

  • 하나의 값으로 묶여있는 데이터를 문자열 기준으로 나눌 때 사용
  • 특정 문자나 패턴으로 나눌 수 있음

주요 옵션

  • sep
    • 문자열을 나눌 구분자 기입
  • maxsplit
    • 최대 split 횟수 (디폴트: 모두 다 나눔)

응용

# 예시 문자열 선언 
s = "aa.bb.cc.dd.ee.ff.gg"
s
aa.bb.cc.dd.ee.ff.gg
# '.' 구분자를 기준으로 데이터를 나눔 
# 아래 두 코드 결과 동일 
s.split('.')
s.split(sep='.')
aabbccddeeffgg




★아래 내용이 핵심★: 컬럼으로 받기

# '.' 구분자를 기준으로 데이터를 나누고 컬럼으로 받음 
# lambda 함수와 결합하여 사용하는 경우 
# 7번 반복, a 를 컬럼 구분자로 받아주고, format 함수를 통해 a0, a1, a2 ... 로 표기
# lambda 함수를 통해 '.' 로 구분. 단, len(x.split('.')), 즉 7 보다 i 가 작을 때 수행
# 중요
for i in range(7):
    df2["a{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)
a0a1a2a3a4a5a6
aabbccddeeffgg

rrule

  • dateutil 라이브러리에 속한 함수
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU
  • 날짜 데이터를 원하는 기준에 따라 output 으로 가져올 수 있음

주요 옵션

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

응용

# 라이브러리 불러오기
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU

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

# 2024-02-01 부터 2024-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력.
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)

for date in weekly_rule:
    print(date.strftime('%Y-%m-%d'))

# 빈 리스트 생성 후 날짜를 담아주기
a=[]
for date in weekly_rule:
    a.append(date.strftime('%Y-%m-%d'))
    
# 2023-02-01 부터 2023-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)

# 데이터프레임에서 특정 날짜기간에 해당하는 데이터만 슬라이싱 하기 
# 빈 리스트 생성 후 날짜를 담아주기
a=[]
for date in weekly_rule:
    a.append(date.strftime('%Y-%m-%d'))
    
# df3 에 있는 날짜 데이터는 string 
# string -> datetimd -> string 의 형태로 변환
# 위에서 받은 리스트에 해당하는 데이터만 필터링하기 위함 
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp']).dt.strftime('%Y-%m-%d')

mask =(df3['Time stamp2'].isin(a))
df3[mask]
profile
2 B R 0 2 B

0개의 댓글

관련 채용 정보