[BDA 데이터분석전처리반(판다스)] 3주차 판다스 기초문법2

YJ·2024년 9월 30일
1
post-thumbnail

판다스 기초 문법

데이터 전처리 추출 등에 필요한 문법

sort_values() - 데이터 정렬

  • 정렬 기준 컬럼이 필요
  • 오름차순으로 정렬할지 내림차순으로 정렬할지
    • 디폴트는 오름차순
    • 내림차순 - ascending = False

데이터 불러오기

mport seaborn as sns
import pandas as pd
dia = sns.load_dataset('diamonds') 

오름차순 정렬

dia.sort_values('carat')

내림차순 정렬

dia.sort_values('carat', ascending = False)

기준 컬럼이 2개 이상 - 앞 컬럼부터 순서대로 정렬의 기준이 됨

display(dia.sort_values(['carat', 'price']))
display(dia.sort_values(['price', 'carat']))

2개 이상의 컬럼도 정렬 기준을 다르게 둘 수 있음

dia.sort_values(['carat', 'price'], ascending = [False, True])

groupby() - 데이터 집계

  • 선택한 컬럼 기준으로 데이터를 묶어서 원하는 통계치를 뽑을때 사용
  • agg() 함수와 함께 통계치를 빠르게 확인함
  • 그룹화된 객체에 get_group() 함수를 사용하여 특정 그룹에 해당하는 데이터만 추출할 때 사용

선택한 컬럼의 클래스별 개수확인

dia.value_counts('cut')

기준컬럼으로 그룹화

cut_gr = dia.groupby('cut')

그룹화된 결과 출력

  • i는 그룹
  • j는 그룹에 속한 데이터
for i,j in ps_gr:
    print(i,j)

특정 그룹에 해당하는 데이터만 추출

cut_gr.get_group('Premium')

기준컬럼 2개 이상 그룹화

cut_gr = dia.groupby(['cut', 'color'])

기준컬럼 2개 이상일 때 특정 그룹에 해당하는 데이터만 추출

cut_gr.get_group(('Premium','G'))

그룹화 이후 특정 통계치를 보고싶은 경우 (agg() 함수)

  • sum, mean, median...
  • agg(새로운 컬럼명=(기준컬럼, 통계치))
dia.groupby('cut', observed=True).agg(price_sum=('price', 'sum'))
# 여러 통계치 한번에 추출
dia.groupby('cut', observed=True).agg(price_sum=('price', 'sum'),
                                      price_mean=('price', 'mean'),
                                      price_std=('price', 'std'),
                                      carat_max=('carat', 'max'),
                                      carat_sum=('carat', 'sum'),
                                      color_count=('color', 'count'))
# 특정 함수 만들어 적용
def min_max(x):
    return x.max()- x.min()
    
dia[['color','carat','price','depth']].groupby('color', observed=True).agg(min_max)

여러 응용 가능

dia.groupby('color', observed=True)['price'].mean()

cut(), qcut() - 구간 나누기

qcut()

  • 데이터를 분위수를 따라 구간을 나눔
  • 형태 : pd.qcut(x,q, labels= ??, retbins=??, precision=?, duplicates=??)
하이퍼파라미터설명예시
x분위수에 따라 구간을 나눌 데이터. 시리즈 또는 배열 형태로 입력 가능x = [1, 2, 3, 4, 5]
q데이터를 나눌 구간 수(분위수). 예를 들어, 4로 설정하면 4분위수로 나눔q=4
labels각 구간에 붙일 이름. 만약 False로 설정하면 구간의 인덱스만 반환labels=['A', 'B', 'C', 'D']
retbinsTrue로 설정하면 구간의 경계값도 함께 반환retbins=True
precision구간 경계값의 소숫점 자릿수를 설정precision=2
duplicates구간 경계값이 중복될 경우 처리 방법을 설정 (e.g., 중복된 경계값을 제거)duplicates='drop'

cut()

  • 데이터를 고정된 값의 구간으로 나누는 함수
  • 데이터의 값 범위에 따라 일정한 크기의 구간을 정의하고, 각 데이터가 해당 구간에 속하게 함
  • 형태: pd.cut(x, bins=??, labels=??, precision=??, right=??, include_lowest=??)
하이퍼파라미터설명예시
x일정한 간격으로 구간을 나눌 데이터. 시리즈 또는 배열 형태로 입력 가능x = [1, 2, 3, 4, 5]
bins구간의 경계값을 명시하거나 구간의 개수를 설정bins=3 or bins=[0, 2, 4, 6]
labels각 구간에 붙일 이름. 만약 False로 설정하면 구간의 인덱스만 반환labels=['Low', 'Medium', 'High']
precision구간 경계값의 소숫점 자릿수를 설정precision=1
right구간의 오른쪽 경계를 포함할지 여부(True: 오른쪽 경계를 포함)right=True
include_lowest첫 번째 구간에 가장 낮은 값도 포함할지 여부(True: 가장 낮은 값을 첫 번째 구간에 포함)include_lowest=True

데이터 만들기

import numpy as np 

data = np.random.randn(100)
data

분위수로 나누기 - qcut

res_qcut = pd.qcut(data, q=5, labels=['매우낮음', '낮음', '중간', '높음', '매우높음'])
res_qcut

고정된 값의 구간 나누기 - cut

res_cut=pd.cut(data, bins=5, labels=['매우낮음', '낮음','중간','높음','매우높음'])
res_cut

apply() - 사용자 정의함수 적용

  • 각 열 또는 행에 대해 반복적인 작업(사용자 정의함수)을 실행
    • 열 단위 : axis = 0
    • 행 단위 : axis = 1
  • 파생변수를 만들 때 용이
# 함수 정의
def calc_carat_size(carat):
  if carat >= 1:
    return "크다"
  elif carat >= 0.5:
    return "중간크기"
  else:
    return "작다"

dia['carat_size'] = dia['carat'].apply(calc_carat_size)

assign() - 새로운 열(파생변수) 추가

  • 기존 열을 기반으로 계산된 값이나 사용자 정의 함수로 새로운 열을 생성
  • 형태 assign(변수명 = lambda 식)
dia.assign(korean_price = lambda x : x['price'] * 1000)

같은 표현

dia['korean_price'] = dia['price'] * 1000

concat(), merge() - 데이터 병합

concat()

  • 단순한 데이터 병합
  • 축(’axis’)를 기준으로 데이터프레임이나 시리즈를 그대로 연결
    • 행(axis=0) - 세로로 길어짐, 열 이름이 같은지 확인하여 같은 열끼리 병합. 열 이름이 일치하지 않으면 NaN으로 채워진 열이 생성됨.
    • 열(axis=1) - 가로로 길어짐, 인덱스가 같은지 확인하여 같은 인덱스끼리 병합. 인덱스가 일치하지 않으면 NaN으로 채워진 행이 생성됨.
  • concat()의 join 종류
    • outer (기본값): 모든 인덱스 또는 열을 포함하고, 일치하지 않는 부분은 NaN으로 채움
    • inner: 공통된 인덱스 또는 열만 포함

merge()

  • 관계형 데이터베이스 스타일 병합
  • 특정 열(column) 또는 인덱스를 기준으로 두 데이터프레임을 병합
    • 두 데이터프레임 간의 하나 이상의 열을 기준으로 세밀하게 병합 가능
    • SQL의 JOIN 개념과 유사
  • 다양한 join 방식을 지원해 데이터 병합에 유연성 제공
  • merge()의 join 종류
    • inner (기본값): 두 데이터프레임의 교집합에 해당하는 데이터만 포함
    • outer: 두 데이터프레임의 합집합에 해당하는 모든 데이터를 포함하고, 일치하지 않는 부분은 NaN으로 채움
    • left: 왼쪽 데이터프레임의 모든 데이터를 포함하고, 오른쪽 데이터프레임에서 일치하는 데이터만 포함 (일치하지 않는 부분은 NaN)
    • right: 오른쪽 데이터프레임의 모든 데이터를 포함하고, 왼쪽 데이터프레임에서 일치하는 데이터만 포함 (일치하지 않는 부분은 NaN)

예시 데이터 생성

test1 = pd.DataFrame({
    '과일종류': ['사과', '바나나', '포도', '딸기', '오렌지'],
    '가격': [1000, 1500, 2000, 2500, 1800]
})

test2 = pd.DataFrame({
    '과일종류': ['사과', '바나나', '포도', '딸기', '수박'],
    '수량': [50, 100, 150, 200, 300]
})

행을 기준으로 단순히 병합

pd.concat([test1, test2], axis=0)

열을 기준으로 단순히 병합

pd.concat([test1, test2], axis=1)

과일종류를 기준으로 inner join

pd.merge(test1, test2, on='과일종류', how='inner')

과일종류를 기준으로 outer join

 pd.merge(test1, test2, on='과일종류', how='outer')
profile
제 글이 유익하셨다면 ♡와 팔로우로 응원 부탁드립니다.

0개의 댓글

관련 채용 정보