4일차-3 Python 프로그래밍 & 라이브러리

정지원·2024년 2월 23일
0

에이블 스쿨 복습

목록 보기
8/51
post-thumbnail

7. Pandas

1) 데이터프레임 생성 및 탐색

(1)데이터프레임이란

  • Pandas 사용 목적이 데이터프레임을 사용하기 위한 목적으로 봐도 된다.
  • 데이터를 처리, 조회, 분석하는 가장 효율적인 방법이 데이터프레임을 사용하는 것이다.
  • 일반적으로 접하게 되는 테이블 형태, 엑셀 형태로 생각하면 된다.
  • 직접 만들 수 있으나 보통은 csv 파일, 엑셀 파일 또는 DB에서 읽어온다.

(2) 데이터프레임 형태

  • 데이터프레임은 인덱스(=행 이름)열 이름이 있고 없고에 따라 다른 형태를 갖습니다.
  • 인덱스란 행을 지정할 때 사용하는 정보이고, 열 이름은 열을 지정할 때 사용하는 정보입니다.

2) 데이터프레임 직접 만들기

  • pd.DataFrame() 함수를 사용해 데이터프레임을 직접 만들 수 있습니다.
  • 대부분 리스트, 딕셔너리, Numpy 배열로부터 데이터프레임을 만듭니다.
  • 데이터프레임을 만들기 위해서는 다음 세 가지를 위한 데이터가 필요합니다.
    • 데이터
    • 열 이름
    • 인덱스 이름
  • 열 이름을 지정하지 않으면 열 번호에 기반한 정수(0, 1, 2...)가 열 이름이 됩니다.
  • 인덱스 이름을 지정하지 않으면 행 번호에 기반한 정수(0, 1, 2...)가 인덱스 이름이 됩니다.

(1) 라이브러리 불러오기

  • 데이터프레임을 사용하기 위해서 pandas 라이브러리를 pd 별칭을 주어 불러옵니다.
import pandas as pd

(2) 딕셔너리로 만들기

  • 딕셔너리로 데이터프레임을 만들면 딕셔너리의 열 이름이 됩니다.
  • 인덱스를 지정하지 않으면 행 번호가 인덱스가 됩니다.
dict1 = {'Name': ['Gildong', 'Sarang', 'Jiemae', 'Yeoin'],
        'Level': ['Gold', 'Bronze', 'Silver', 'Gold'],
        'Score': [56000, 23000, 44000, 52000]}<code>
        
 > df = pd.DataFrame(dict1)
df.head()
NameLevelScore
0GildongGold56000
1SarangBronze23000
2JiemaeSilver44000
3YeoinGold52000

(3) CSV파일 읽어오기

  • read_csv() 함수를 사용해서 CSV 파일에서 데이터를 읽어온다.
path = 'titanic_simple.csv'
data = pd.read_csv(path)  

2) 데이터프레임 탐색

  • 파일에서 불러온 데이터의 크기, 내용, 분포, 누락된 값 등을 확인할 수 있어야 한다.
  • 확인된 내용을 통해 데이터 전처리 필요 여부를 결정한다.
  • 데이터를 알아야 데이터를 분석할 수 있다.

(1) 상위, 하위 일부 데이터, 크기 확인

  • head(n), tail(n) 메소드를 사용해 앞 뒤 데이터를 확인한다.
  • 개수를 지정하지 않으면 기본적으로 5개 행이 조회됨
data.head(10) # 상위 10개 데이터

data.tail(3) # 하위 3개 데이터
  • .shape 크기 확인
  • (rows, cols) 값을 갖는 튜플 형태로 확인이 가능합니다.
  • 데이터를 분석할 때 처리할 데이터 양을 확인하는 목적으로 많이 사용 합니다.
data.shape # 행, 열 

(2) 열, 행 정보 보기

- 열 확인 방법

data.columns # 인덱스 형태로 출력

data.columns.values # np array 형태로 출력

list(data) # 데이터프레임을 리스트 함수에 넣으면 열 이릉ㅁ이 리스트로 반환

- 자료형 확인 방법

data.dtypes

data.info() # 자료형, 행, 열, 값 개수 확인

- 기초 통계정보 확인

data.describe() # count, mean, std, min/max, 25%, 75% 등

(3) 정렬해서 보기

  • 인덱스를 기준으로 정렬하는 방법과 특정 열을 기준으로 정렬하는 방법이 있다.
  • sort_values() 메소드로 특정 열을 기준으로 정렬한다.
  • ascending 옵션을 설정해 오름차순, 내림차순을 설정할 수 있다.
    • ascending=True: 오름차순 정렬(기본값)
    • ascending=False: 내림차순 정렬

- 단일 열 정렬

data.sort_values(by='열 이름', ascending = False) 
  • '열 이름'의 열을 기준으로 내림차순으로 정렬

- 복합 열 정렬

data.sort_values(by=['열 이름1','열 이름2'], ascending = [True, False]) 
  • 열 이름1을 기준으로 정렬 오름차순 정렬하고 열이름 1이 동일하면 열이름 2를 내림차순 기준으로 정렬

인덱스 reset_index

  • 열 정렬하고 순서가 다른 인덱스를 reset하여 0부터 시작
temp = data.sort_values(by = ['열 이름1','열 이름2'],
						ascending = [True, False])
temp.reset_index(drop = True) 
  • reset_index() 함수로 인덱스가 재정렬
  • drop = True 이면 인덱스만 재정렬 된다.
  • drop = False 이면 인덱스 재정렬하고, 원래의 인덱스를 ('index')열을 생성하여 정보를 남겨둠

(4) 기본 집계

  • 데이터를 좀더 이해하기 위해 고유값, 합, 평균, 최댓값, 최솟값 등을 확인할 수 있다.

고유값 확인 unique()

data['MaritalStatus'].unique() # 그 열이 가진 값들을 출력

고유값 개수 확인

data['MaritalStatus'].value_counts() # 각 고유값별 개수 확인

기본 집계 메소드

  • .sum(): 열 합계 조회
  • .max(): 열 최댓값 조회
  • .mean(): 열 평균값 확인
  • .median: 열 중앙값 확인

3.데이터프레임 조회

  • 시리즈(Series)와 데이터프레임(DataFrame)
    • 데이터프레임 : 2차원 구조
    • 시리즈 : 1차원 구조
      • 데이터프레임에서 열 하나를 띄어 내면 시리즈라고 생각하면 된다.

(1) 특정 열 조회

  • df.loc[ : , [열 이름1, 열 이름2,...]] 형태로 조회할 열 이름을 리스트로 지정한다.
  • 열 부분은 생략할 수 있었지만, 행 부분을 생략할 수는 없다.
  • 하지만 df[[열 이름1, 열 이름2,...]] 형태로 인덱서를 생략함이 일반적이다.
  • 조회할 열이 하나면 리스트 형태가 아니어도 된다.

열 조회 방법

data['열 이름']  # data.열 이름
				#모두 시리즈로 출력

data[['열1', '열2']] #데이터프레임으로 출력

(2) 조건으로 조회 : .loc

  • df.loc[조건] 형태로 조건을 지정해 조건에 만족하는 데이터만 조회할 수 있다.
  • 우선 조건이 제대로 판단이 되는지 확인한 후 그 조건을 대 괄호 안에 넣으면 된다.

단일 조건 조회

data['열이름'] > 10
# 열의 값이 10 보다 큰지 True False가 시리즈로 출력
data.loc[data['열이름']>10]
# 열이름의 값이 10보다 큰 행들을 데이터프레임으로 출력

여러 조건 조회

  • [ ]안에 조건을 여러개 연결할 때 and와 or 대신에 &와 |를 사용해야 한다.
  • 그리고 각 조건들은 (조건1) & (조건2) 형태로 괄호로 묶어야 한다.
data.loc[(data['열1'] > 10) & (data['열2'] == 4)]
# 열1이 10보다 **크고** 열2가 4인 행을 데이터프레임으로 출력함
data.loc[(data['열1'] > 10) | (data['열2'] == 4)]
# 열1이 10보다 **크거나** 열2가 4인 행을 데이터프레임으로 출력함

isin(), between()

  • isin([값1, 값2,..., 값n]): 값1 또는 값2 또는...값n인 데이터만 조회한다.
  • 주의) isin(리스트) 값들을 리스트 형태로 입력해야 한다.
data.loc[data['열1'].isin([1,4])]
  • 열1의 값이 1이거나 4인 행을 데이터 프레임으로 출력
data.loc[(data['열1']==1) | (data['열1'] == 4)]
  • isin과 | 의미가 같다

  • between(값1, 값2): 값1 ~ 값2까지 범위안의 데이터만 조회한다.

    • inclusive = 'both' (기본값)
      • 'left', 'right', 'neither'
data.loc[data['열1'].between(25, 30)]
# 열1의 값이 25이상 30이하인 행을 데이터프레임으로 조회
data.loc[(data['열1'] >= 25) & (data['열1'] <= 30)]
# between과 & 의미가 같다.
data.loc[data['열1'].between(25, 30, inclusive ='right')]
# 열1의 값이 **25초과 30이하**인 것 조회
- both는 둘다 포함
- right는 오른쪽 경계 포함
- left는 왼쪽 경계포함
- neither은 양쪽다 제외

조건을 만족하는 행의 일부 열 조회

  • df.loc[조건, ['열 이름1', '열 이름2',...]] 형태로 조회할 열을 리스트로 지정합니다. ==> 2차원, 데이터프레임 형태로 조회
data.loc[data['열1'] >= 100, ['열2']] # 단일 열 조회
-1100 이상인 열2의 값만 데이터프레임으로 조회
data.loc[data['열1'] >= 100, ['열2', '열3']] # 여러 열 조회
-1100 이상인 열2와 열3의 값을 데이터프레임으로 조회

4.데이터프레임 집계 (groupby)

  • sum(), mean(), max(), min(), count() 메소드를 사용해 지정한 열 또는 열들을 기준으로 집계한다.
  • 평균을 구하는 메소드가 avg()가 아닌 mean() 임을 주의
data.sum()
data.mean()
data.max()
data.min()
data.count()

집계하기 groupby('열1',as_index=True)

  • 만일 day 별로 합을 구하고자 한다면
  • 아래 결과 값 네 개를 더하면 전체 합이 된다
  • as_index=True를 설정(기본값)하면 집계 기준이 되는 열이 인덱스 열이 된다.
  • 집계 결과가 data 열만 가지니 시리즈가 된다.
data.groupby('열1',as_index=True)['열2'].mean()
# 열1별 열2의 평균이 시리즈로 나옴
data.groupby('Month', as_index = True)[['User']].mean()
# Month별 User의 평균 데이터프레임으로 나옴
  • as_index = False를 하면 행 번호를 기반으로 한 정수 값이 인덱스로 설정된다.(많이 사용)
  • as_index = True는 기준이 되는 데이터를 인덱스로 취함

여러 열 집계

data.groupby('Month', as_index = False)[['User', 'Fare']].mean()
#월별 유저 수와 요금의 평균

by= [] 사용

data.gropby(by = ['Month', 'Year'], as_index=False)[['User', 'Fare']].mean()
# 월별 연도별 사용자 수와 요금의 평균

출력데이터 생략

data.groupby('Month', as_index=False).mean()
# 월별 모든 값에 대한 평균

여러함수로 한번에 집계 data.groupby().agg([])

data.groupby('Month', as_index=False)[['User']].agg(['min', 'max', 'mean])
# 월별 사용자수의 최소 최대 평균 

[참고] 한기영 강사님 수업자료

profile
뒤늦게 프로그래밍을 시작한 응애

0개의 댓글