[Python] Pandas를 이용한 데이터 처리 방법 정리

데이터과학과 Python

 

데이터과학이란?

  • 데이터를 통해 주어진 문제를 해결하는 접근법
  • 데이터 수집, 처리, 분석, 시각화 등을 모두 포괄
  • 컴퓨터과학적 소양, 수리과학에서의 배경 지식, 분석 대상이 될 분야에 대한 기초 지식 필요

 

 

데이터과학을 위한 Python 라이브러리의 종류

Pandas

  • DataFrame 구조를 이용한 결측치 제거, 데이터 병합 등 전처리 수행
import pandas as pd

NumPy

  • 행렬, 다차원 배열 등 수학 연산을 주로 수행하는 라이브러리
import numpy as np

Matplotlib

  • 주어진 자료를 플롯 혹은 차트로 시각화하기 위한 라이브러리
import matplotlib.pyplot as plt

 

Pandas와 DataFrame

라이브러리 사용법

import random

num = random.randint(1,6)

print(num)

: random 이라는 이름의 라이브러리 또는 모듈을 불러온 후 , random이 제공하는 함수 randint를 사용

 

외부 데이터셋 불러오기

df = pd.read_excel('파일명.xlsx')
df = pd.read_csv('파일명.csv', engine = 'python')

 

인덱스 열이 별도로 존재하는 경우

df = pd.read_excel('파일명.xlsx', index_col = 0)

 

DataFrame의 생성

1. Dictionary 이용

import pandas as pd

df_dict = dict()

df_dict['이름'] = ['김고려', '최안암', '박정보']
df_dict['GPA'] = [4.0, 3.9, 4.2]
df_dict['소속'] = ['정보대학', '공과대학', '자유전공학부']

df = pd.DataFrame(df_dict)

df

열 제목을 key, 값을 value로 갖는 dictionary로 Pandas에서의 DataFrame을 생성할 수 있음

⇒ 세로로 한 줄씩 생성함!!

 

2. List 이용

import pandas as pd

df_list = []

df_list.append(['김고려', 4.0, '정보대학'])
df_list.append(['최안암', 3.9, '공과대학'])
df_list.append(['박정보', 4.2, '자유전공학부'])

df = pd.DataFrame(df_list, columns = ['이름', 'GPA', '소속'])

df

각 행을 개별 원소로 갖는 list로 Pandas에서의 DataFrame을 생성할 수 있음

⇒ 가로로 한 줄씩 생성함!!

출력한 모습은 이과 같다.

 

DataFrame에서 원하는 값 추출하기

loc를 이용한 값 선택

import pandas as pd

df.loc[[0,2], ['이름', 'GPA']]
  • df.loc[행,열]과 같은 문법으로 사용
  • 행 명칭과 열 명칭을 이용해 값 추출 가능
df.loc[::2, :]

인덱스가 짝수인 열만 추출

 

iloc를 이용한 값 선택

import pandas as pd

df.iloc[[0,2], [0,2]]
  • df.iloc[행,열]과 같은 문법으로 사용
  • 행 index와 열 index를 이용해 값 추출 가능

 

drop : 필요 없는 행 또는 열을 제거하기

df = df.drop(2, axis = 0)  # 인덱스가 2인 행 제거
df = df.drop('GPA', axis = 1) # GPA 열 제거

df = df.drop([0,1], axis = 0)  # 인덱스가 0,1인 행 제거
df = df.drop(['GPA', '소속'], axis = 1)  # GPA 열과 소속 열 제거 

axis = 0 : 행, axis = 1 : 열

 

concat : 데이터 단순히 붙이기

df_new = pd.concat([df1, df2], axis = 1)  # 열을 붙이기 위한 concat

하단 코드와 같이 행을 concat하고 인덱스는 새로 설정할 수 있음

df_new = pd.concat([df1, df2], axis = 0) 
df_new = df_new.reset_index(drop = True)  # 인덱스를 리셋해 df_new 업데이트
  • reset_index : 인덱스 초기화
    • reset_index(drop = True) : 기존 인덱스 열이 새롭게 대체됨
    • reset_index() : 새로운 인덱스 열이 추가됨

 

merge : 키 값을 기준으로 데이터 합치기

df_new = df1.merge(df2, how = 'left', on = '이름')
  • LEFT JOIN
    • 왼쪽 책장에 오른쪽 데이터를 밀어넣기
    • 왼쪽에 없는 key를 가진 오른쪽 데이터는 합쳐지지 않음
  • RIGHT JOIN
    • 오른쪽 책장에 왼쪽 데이터를 밀어넣기
    • 오른쪽에 없는 key를 가진 왼쪽 데이터는 합쳐지지 않음

 

DataFrame 내보내기

df.to_csv('파일명.csv')

 

Pandas와 데이터 필터링

소속 대학이 공과대학이 아니며 등록 학기가 3학기 이상인 학생만을 추출하기

cond1 = df['소속'] != '공과대학'
cond2 = df['등록학기'] >= 3
cond = cond1 & cond2

df_new = df.loc[cond]

Q) 상단 코드에서 & 대신 and를 사용해도 될까?

→ and는 단일 bool 자료형에서만 사용 가능하므로, 오류가 발생한다.

 

 

소속 대학이 정보대학이거나 평균 학점이 4.0 미만인 학생만을 추출하기

cond1 = df['소속'] == '정보대학'
cond2 = df['GPA'] < 4.0
cond = cond1 | cond2

df_new = df.loc[cond]

Q) 상단 코드에서 | 대신 or를 사용해도 될까?

→ 마찬가지로, 오류가 발생한다.

 

DataFrame에서의 정렬

df_new = df.sort_values(by = 'GPA', ascending = True)
  • sort_values 를 이용하여 정렬 수행 가능
  • ascending을 False로 설정하면 내림차순 정렬

 

df.shape의 사용

  • df.shape → (행 개수, 열 개수)
  • df.shape[0] → 행 개수
  • df.shape[1] → 열 개수