예제로 익히는 Python - 2, 3

김주호·2024년 10월 28일

1. 파이썬 데이터 결합

Merge(중요3)

  • on: 조건 컬럼이 한개인지 여러개인지
  • how: 어떤 조인 방식을 사용할 것인지 (inner, outer, left, right)
  • left ot / right on : 열기준 병합 시 기준으로 할 열의 양측 이름이 다르다면, 각각 어떤 열을 기준으로 할 지 지정합니다.
  • sort: 병합 후 인덱스 정렬 여부(True/False)
  • suffixes: 중복된 컬럼 이름의 처리
  • 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','_rihgt'))

Join(중요2)

개념: pandas 의 함수 중 하나로 Join은 인덱스 기준으로 테이블을 병합합니다. 인덱스란 축을 의미

이를 기준으로, 다양한 옵션을 통해 조인을 할 수 있습니다.

주요옵션

  • 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 (중요3)

개념: pandas 의 함수 중 하나로, 여러 데이터프레임 또는 시리즈를 특정 축을 따라 연결하는 데 사용됩니다.

주요옵션

  • 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(중요1)

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

주요옵션

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

문법

#기능이 없어질 예정으로 아래와 같이 concat 으로 변경하여 실행해주시면 됩니다. 
#에러가 아닌 경고메시지로, 이를 무시하고 싶다면 아래와 같은 코드를 입력해주시면 됩니다.
#import warnings
#warnings.filterwarnings('ignore')
#단순 결합, 없는 건 NaN으로 처리되고 결합
#df2 가 df 의 아래로 붙음

df.append(df2)

2. Pivot Table

개념: 데이터의 열을 기준으로 피벗테이블로 변환시키는 함수.

데이터 가공 및 시각화를 위해, 데이터프레임을 자유롭게 변환하는 pivot table 은 필수입니다

내가 원하는 컬럼들로 새로운 데이터프레임을 만들고, 이를 계산까지 할 수 있어요!

주요옵션

  • index: 인덱스(축) 으로 사용될 열
  • columns: 열로 사용될 열
  • values: 값으로 사용될 열
  • index 및 columns에 리스트 형태를 입력할 경우 → 멀티 인덱스 기반 피벗테이블이 생성
  • values 에 리스트를 입력 할 경우 → 각 값에 대한 테이블이 연속적으로 생성됩니다.
  • aggfunc: 어떠한 계산을 할 지

  • fill_value: NaN 값을 처리하고 싶을 때 사용, fill_value=0 이 가장 많이 사용됨
  • dropna: 결측치(na)삭제 여부 결정
  • sort: index or columns 기준으로 정렬

문법 예시

#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'])

#성별을 축으로 하고, 사이즈, 나이별 고객id 고유하게 카운트 
pd.pivot_table(df2, index=['Gender'], columns=['Size','Age'], values='Customer ID', aggfunc='nunique')

3. 그 외 유요한 메서드

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.split('.')
    s.split(sep='.')

    **# '.' 구분자를 기준으로 데이터를 나누고 컬럼으로 받음 
    # 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)
    ```

rrule

개념: dateutil 라이브러리에 속한 함수로, 날짜 데이터를 원하는 기준에 따라 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 -> datetime -> string 의 형태로 변환
    # 위에서 받은 리스트에 해당하는 데이터만 필터링하기 위함** 
    df3['Time stamp2'] = pd.to_datetime(df3['Time stamp']).dt.strftime('%Y-%m-%d')

    mask =(df3['Time stamp2'].isin(a))
    df3[mask]
    ```

0개의 댓글