Python

[Python] Pandas 사용 방법

allempty_sheep 2024. 7. 30. 15:54
반응형

pandas는 테이블 형태의 데이터를 쉽게 다룰 수 있는 파이썬 라이브러리이다.

 

Anaconda 를 설치 하였다면 판다스를 바로 사용 할 수 있다.

엑셀 파일을 하나 만들어서 사용 해 보자.

# 라이브러리 호출
import pandas as pd

sample = pd.read_excel('./datasalon-master/02_개정판/2_Data_Analysis_Basic/files\\sample_1.xlsx', #파일 위치
                           header = 1,     # 헤더의 위치를 나타냄
                           skipfooter = 2, # 마지막줄 2줄 생략
                          usecols = 'A:C') # A컬럼부터 C 컬럼까지 가지고 옴.
sample.head(3)

 

 

💨 info() 함수

데이터에 대한 요약 정보를 제공.

sample.info()

💨 describe() 함수

여러가지 통계량을 출력 해 준다.

sample.describe()

 

💨전체 가져오기

sample

 

 

💨 한개의 컬럼 가져오기

sample['입국객수']

 

💨 여러개 컬럼 가져오기

sample[['국적코드','입국객수']]

 

💨 컬럼 추가하기

sample['기준년월'] = '2024-07-31'
sample

 

💨 row 기준 선택

male = (sample['성별'] == '남성')
male

 

sample[male]

 

personNum = (sample['입국객수'] >15000)
sample[personNum]

 

A01, A18 국적 코드가 있는 내역 출력

conditions = (sample['국적코드'].isin(['A01', 'A18']))
sample[conditions]

 

 

위의 조건에 해당되지 않는 내역 출력

sample[conditions == False]

 

 

 

 

위를 사용한 문제를 하나 풀어 보자.


1. 엑셀에서 전년동기 컬럼값을 추가로 가져온다

2. 성별이 여자이고 입국객수와 전년동기 차이가 2만명 이상인 내역만 출력

3. ' 국적코드', '성별', '입국객수', '전년동기', '기준년월' 컬럼이 나와야 한다.
 

 

 

 

conditions = (sample['성별'] == '여성')
conditions2 = ((sample['입국객수'] - sample['전년동기']) >= 20000)

sample[conditions & conditions2]

 

 

💨  데이터 통합

통합 전 국적코드에 대한 국적 명을 가지고 있는 파일을 가져 올 것이다.

 

code_master = pd.read_excel('./datasalon-master/02_개정판/2_Data_Analysis_Basic/files/sample_codemaster.xlsx')
code_master

 

merge 합수를 이용해서 컬럼을 추가한다.

왼쪽 테이블은 sample, 오른쪽 테이블은 code_master 을 가져오고

왼쪽 테이블을 기준으로 '국적코드' 를 기준으로 합친다.

sample_code = pd.merge(left = sample,           # 왼쪽 테이블
                         right = code_master,   # 오른쪽 테이블
                         how = 'left',          # 기준 테이블
                         left_on = '국적코드',  # 왼쪽 테이블 기준 컬럼
                         right_on = '국적코드') # 오른쪽 테이블 기준 컬럼
sample_code

 

inner 을 이용하여 컬럼값이 일치하는 것만 가져올 수도 있다.

sample_code_inner = pd.merge(left = sample,           # 왼쪽 테이블
                         right = code_master,   # 오른쪽 테이블
                         how = 'inner',         # 기준 테이블
                         left_on = '국적코드',  # 왼쪽 테이블 기준 컬럼
                         right_on = '국적코드') # 오른쪽 테이블 기준 컬럼
sample_code_inner

 

 

데이터 베이스에서 사용하는 Join 에는 네가지가 있는데 각각 다음과 같다.

1.inner join(=내부조인=등가조인)
  두 테이블 조인시 양쪽다 동일한 데이터 존재
  해야 한다.

2.outer join(=외부조인)

  from x,x

  - left outer join 
  - right outer join

  2-1) oracle outer join

  select *
    from emp e,dept d
   where e.deptno = d.deptno(+)
     and e.bonus is not null;

  2-2) mariadb outer join

    select *
      from emp e  
           left outer join dept d
           on e.deptno = d.deptno         where e.depno in (10,20)
      and e.bonus is not null;
       

3.self join
  같은 테이블을 조인

4.cartesian product
 
  emp: 100건,dept:30건   

  select *
    from emp e,dept d

 

통합을 위해 샘플 코드를 하나 더 들고 오자.

 

sample2 = pd.read_excel('./datasalon-master/02_개정판/2_Data_Analysis_Basic/files/sample_2.xlsx', #파일 위치
                           header = 1,     # 헤더의 위치를 나타냄
                           skipfooter = 2, # 마지막줄 2줄 생략
                          usecols = 'A:D') # A컬럼부터 C 컬럼까지 가지고 옴.

sample2['기준년월'] = '2024-08'

sample_code_2 = pd.merge(left = sample2,           # 왼쪽 테이블
                         right = code_master,   # 오른쪽 테이블
                         how = 'left',         # 기준 테이블
                         left_on = '국적코드',  # 왼쪽 테이블 기준 컬럼
                         right_on = '국적코드') # 오른쪽 테이블 기준 컬럼
sample_code_2

 


- 아래로 통합

최신 pandas (2 버전이상) 에서는 append 함수가 사라지고 concat 함수로 대체

판다스 버전은 아래와 같이 확인 할 수 있다.

print(pd.__version__)

 

append 를 사용시 'dataframe' object has no attribute 'append' 라는 에러는 볼 수 있다.

sample = pd.concat([sample_code, sample_code_2], ignore_index = True)
sample

 

해당 데이터를 엑셀 파일로 저장 해 보자.

sample.to_excel('./방문객수.xlsx')

 

해당 위치에 저장이 잘 된 것을 확인 할 수 있다.

 

index 번호를 제외하고 싶다면 다음과 같이 하면된다.

sample.to_excel('./방문객수.xlsx', index = False)

 

 

💨  pivot 테이블 생성

피벗 테이블은 기존 데이터의 컬럼을 재구성하여 데이터 통계를 한눈에 파악 할 수 있게 해준다.

sample_pivot = sample.pivot_table(values = '입국객수',  # 내부에 들어갈 엑셀 값
                                  index = '국적명',     # row(행)에 배치 할 값
                                  columns = '기준년월', # column(열)에 배치 할 값
                                  aggfunc = 'mean')     # 입국객수를 index, column 기준으로 평균을 계산
sample_pivot

 

 

aggfunc 옵션은 다음과 같다.

함수명 설명
mean 평균
sum 합계
min 최솟값
dedian 중앙값
max 최댓값
count 개수
nunique 중복을 제거한 후 원소 개수

 

 

최대 입국객수를 구해보자.

sample_pivot_2 = sample.pivot_table(values = '입국객수', 
                                  index = '국적명',     
                                  aggfunc = 'max')    
sample_pivot_2