본문 바로가기
PYTHON/빅데이터분석기사

Pandas-02 (drinks s2-10~16)

by 쿠룽지 2023. 11. 5.
728x90
반응형
728x90

 

 

1. 결측치 확인 및 해결

결측치

  • 값이 없음을 나타냄
  • NaN, NaT, None 등으로 표기

결측치 확인

  • df.isna() : 결측치에 대해 True, 아니면 False
  • df.notna() : 결측치에 대해 False, 아니면 True
  • df.isnull() : 결측치에 대해 True, 아니면 False
  • df.notnull() : 결측치에 대해 False, 아니면 True
  • df.isna().sum() : 결측치에 대해 컬럼별 개수

 

 

 

2. 데이터 종류 확인

  • 주로 범주형 데이터에 사용함
  • 성별, 지역, 부서 등 몇 개의 그룹으로 표현되는 데이터
  • 숫자 or 문자열로 표현 가능
  • series.unique() : 결측치를 포함한 데이터의 종류를 ndarray로 반환 (중복 제외)
  • series.value_counts() : 결측치를 제외한 데이터 종류별 개수를 series로 반환
#대륙의 종류 알아보기
df['대륙'].unique() #array(['AS', 'EU', 'AF', nan, 'SA', 'OC'], dtype=object)

#같은 값 series로 출력
pd.Series(df['대륙'].unique())

#대륙별 개수 알아보기
df['대륙'].value_counts()

#결측치 컬럼 별 집계
df.isna().sum()

#isna()를 사용해 대륙에서 결측치로 취급된 데이터만 출력
df[df['대륙'].isna()]

 

 

 

3. 결측치 해결 방법

  1. NA(값)를 NaN(결측치)로 읽는 동작을 멈추게 함
    • pd.read_csv(파일이름, na_filter=False) : 파일에서 데이터를 불러올 때 결측치로 인지되는 데이터를 자동으로 결측치로 읽어오는 동작을 멈추게 함
  2. 결측치를 다른 값으로 채우기 함
    • df.fillna(값) / series.fillna(값) : 결측값을 특정 값으로 채우기
      • 연속형 데이터 : 0으로 채우기, 평균값으로 채우기, 범주별 평균값 채우기 등
      • 범주형 데이터 : 다른 범주로 만들어 채우기
    • df.loc[series.isna(), 컬럼명]=값
# 1번 해결방법) NA 문자를 결측치로 읽어들이는 동작 멈추게 하기
temp = pd.read_csv('./data_01/drinks.csv', na_filter = False)
    
# 2번 해결방법) NaN으로 읽어온 데이터를 NA로 변경
df['대륙'] = df['대륙'].fillna('NA')
df.loc[df['대륙'].isna(), '대륙']='NA'
df = df.fillna('NA')

#확인
df.isna().sum()
df['대륙'].unique()

 

 

 

4. 통계값 구하기

  • DataFrame.describe() : 컬럼별 count, mean, std, min, max, Q1, Q2, Q3 등의 통계값 구하기
  • DataFrame.count() : 개수
  • DataFrame.sum() : 합계
  • DataFrame.mean() : 평균
  • DataFrame.median() : 중앙값
  • DataFrame.std() : 표준편차
  • DataFrame.var() : 분산
  • DataFrame.quantile() : 분위수
  • DataFrame.함수(axis=1)을 사용하여 행별 통계값을 구할 수 있음
    axis=0 : 기본값이며, 행을 이동하며, 행과 행의 연산을 수행함
    axis=1 : 컬럼을 이동하며 컬럼과 컬럼의 연산을 수행함
#전세계 맥주, 증류주, 와인, 알코올 소비에 대한 정보만 추출하여 df2로 지정합니다.
df2 = df[['맥주', '증류주', '와인', '알코올']]

#전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) '평균'만 구해봅니다.
df2.mean()

#전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) '중앙값'만 구해봅니다.
df2.median()

#전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) '최대값'만 구해봅니다.
df2.max()

#전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) '최소값'만 구해봅니다.
df2.min()

#전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) Q1, Q2, Q3를 구해봅니다.
temp = df2.quantile([0.25,0.5,0.75])
temp.index=['Q1', 'Q2', 'Q3']

#표준편차(std), 분산(var)
df2.std()
df2.var()

 

 

 

각 컬럼별 함수 적용

  • df.apply(함수) : series로 결과가 반환
  • df.apply(['함수1','함수2']) : df로 결과가 반환
  • 사용자 정의 함수, 외부 함수, 내장함수 등 다양한 함수 사용 가능
  • series의 통계 함수들은 문자열 형태로 사용할 수 있음 : 'min', 'max', 'count', 'std', 'var', 'mean', 'median'
#df2의 각 컬럼별 평균을 구해 봅니다.
df2.apply('mean')

#df2의 최소, 최대, 평균값을 구해봅니다.
df2.apply(['min','max','mean'])

#numpy
import numpy as np
df2.apply([np.sum, min, max, lambda x: x[1]])

 

 

 

주류 소비량 비교

#와인 소비량이 맥주 + 증류주 소비량보다 큰 나라를 검색해,'대륙'을 기준으로 정렬해 보자
df[df['와인'] > (df['맥주'] + df['증류주'])].sort_values('대륙')

#맥주 소비량이 230 초과이면서, 와인 소비량이 230 초과인 나라를 검색해 보자
df[(df['맥주']>230) & (df['와인']>230)]

#대륙이 'AS'인 국가들의 정보를 검색해 보자
df[df['대륙']=='AS']

 

 

 

5.  컬럼

1) 컬럼 추가

  • df[컬럼명] = 데이터 목록
  • 컬럼명은 기존 df에 존재하지 않는 이름이어야 함
  • 데이터 목록은 df의 다른 컬럼들과 같은 개수여야 하며, list/ series 등의 형태일 수 있음

2) 컬럼 제거

  • del df[컬럼명]
  • df.drop(컬럼명, axis=1)
  • df.drop([컬럼명1, 컬럼명2, ...], axis=1)
  • df.drop(columns=[컬럼명, ..])

3) 행 제거

  • axis=0이 기본값이므로 생략 가능
  • df.drop(행이름)
  • df.drop([행이름1, 행이름2, ...])
  • df.drop(rows=[행이름1, 행이름2, ...])

+ 특정 행, 열 제거

  • df.drop(행, axis=0)
  • df.drop([행1, 행2, ...], axis=0)
  • df.drop(열, axis=1)
  • df.drop([열1, 열2, ...], axis=1)
#국가별 주류 소비량 합계를 구해 새로운 컬럼 ('주류소비량')를 추가합니다
#주류소비량 = '맥주' + '증류주' + '와인'
df['주류소비량'] = df['맥주'] + df['증류주'] + df['와인']

#주류소비량2 = ['맥주', '증류주', '와인']에 대해 DataFrame.sum(axis=1) 함수 사용
df['주류소비량2'] = [['맥주', '증류주', '와인']].sum(axis=1)

#주류 소비량 대비 알코올 소비량 비율을 구해 새로운 컬럼 ('알코올비율')을 추가합니다.
#알코올비율 = '알코올' / '주류소비량'
df['알코올비율'] = df['알코올'] / df['주류소비량']

#알코올비율이 높은 국가 TOP5의 ['국가', '주류소비량', '알코올비율'] 정보를 구해 봅니다.
#HINT) sort_values, indexing 사용
df[['국가', '주류소비량', '알코올비율']].sort_values('알코올비율', ascending=False).head()

#주류소비량을 복사하여 주류소비량2를 추가합니다.
df['주류소비량2'] = df['주류소비량'].copy()

#'주류소비량2' 컬럼을 제거하여 봅니다.
del df['주류소비량2'] 
df = df.drop('주류소비량2', axis=1)
df = df.drop(columns=['주류소비량2'])

#'알코올비율'이 NaN인 것에 대해 0으로 채우기 합니다.
df['알코올비율'] = df['알코올비율'].fillna(0)

 

 

 

6. Columns, Index 상호 변경

  • df.set_index(컬럼명) : 지정한 컬럼을 index로 설정
  • df.set_index([컬럼명1, 컬럼명2, ...]) : 컬럼 목록을 index(Multi Index)로 설정
    • columns에서 index쪽으로 이동됨, 기존 index는 제거
  • df.reset_index() : 모든 index가 columns로 이동
    • index는 rangeIndex로 대체됨 (0 1 2 3 , ...)

 

 

7. 원하는 컬럼만 추출하기

  • df.loc[:, 시작컬럼명: 끝컬럼명]
  • df.iloc[:, 시작인덱스: 끝인덱스+1]
    • 시작인덱스/ 끝인덱스 생략 가능 (ex- : :-1 / : 1:)
#국가별 주류 소비량 합계(맥주, 증류주, 와인의 합)를 구해 봅니다.
df.set_index('국가')[['맥주','증류주','와인']].sum(axis=1)

#df를 ['대륙', '국가']를 index로 지정하고, 대륙별, 국가명으로  정렬하여 df로 저장합니다.
df = df.set_index(['대륙', '국가']).sort_values()

#df의 index를 모두 columns로 이동합니다.
df = df.reset_index()

#----------------------------------------------------------------------------

#	대륙	국가	맥주	증류주	와인	알코올	주류소비량	알코올비율 (korea의 컬럼)

#전세계 평균 소비량과 한국('South Korea')의 소비량을 비교해 보려고 합니다.
#먼저, 한국의 소비량을 조회하여 korea로 저장합니다.
korea = df[df['국가'] == 'South Korea']

#korea 정보 중에서 대륙 정보를 제거합니다.
korea.drop('대륙', axis=1)

#indexing을 사용하여 korea 정보 중 대륙 정보를 제거합니다. (DataFrame.loc[])
korea.loc[:, '국가':'알코올비율']
df.loc[df['국가']=='South Korea', '국가':'알코올비율']

#indexing을 사용하여 korea 정보 중 대륙 정보를 제거합니다. (DataFrame.iloc[])
korea.iloc[:, 1:] 

#세계의 각 컬럼별 평균을 구하여 DataFrame으로 만들고, worldwide라는 이름을 지정합니다
#세계의 각 컬럼별 평균은 DataFrame.mean()을 사용합니다.
worldwide = pd.DataFrame(df.mean())

 

 

 

8. df의 행/열 전환

  • df.T : index, columns의 위치가 바뀜
#worldwide의 행과 열을 전환해 wwT로 저장합니다.
wwT = worldwide.T

 

 

 

9. df의 임의 위치 열(=컬럼) 삽입

  • df.insert(위치, 컬럼, 값) : inplace 동작됨 (새로운 return 없음)
#wwT의 맨 앞에 '국가' 컬럼을 'World Wide' 값으로 추가합니다. (여러 번 추가하면 안됨)
wwT.insert(0, '국가', 'World Wide')

#'Temp' 컬럼을 맨 앞에 추가 'World Wide'를 list로 추가
wwT.insert(0, 'Temp', ['World Wide'])

#'Temp' 컬럼 제거
wwT = wwT.drop(['Temp'], axis=1)

 

 

 

10. df의 행(2개 이상) 추가

  • df.append(df) : 새로운 df 반환
  • 2개를 1개로 합치는 작업 가능
#korea 뒤에 wwT를 추가하여 compT 로 이름 붙입니다
compT = korea.append(wwT)

 

 

10. 여러 개의 df를 합쳐 하나의 df 생성

  • pd.concat([df1, df2, ...], axis=0) : index 방향으로 합치기
  • pd.concat([df1, df2, ...], axis=1) : columns 방향으로 합치기
  • df.append() 와의 차이점 : 여러 개의 df목록을 주어 여러 개를 한 번에 합칠 수 있음 (append 는 1개)
#wwT와 korea 를 합쳐 하나의 DataFrame을 생성하여 df2로 저장합니다.
df2 = pd.concat([wwT, korea])

#df2를 '국가' 컬럼을 index로 설정하여 df3으로 저장합니다
df3 = df2.set_index('국가')

#df3의 행,열을 전환하여 출력합니다.
df3.T

 

 

 

맥주 소비량

#주류소비량이 있으면서, 맥주를 소비하지 않는 나라의 맥주, 증류주, 와인, 알코올, 대륙 등 모든 정보를 구해 봅니다.
#indexing 사용
df[(df['주류소비량']>0) & (df['맥주']==0)]
df.loc[(df['주류소비량']>0) & (df['맥주']==0), '대륙':'알코올']

#주류소비량이 있으면서, 맥주를 소비하지 않는 국가의 국가명 목록을 구해봅니다.
df.loc[(df['주류소비량']>0) & (df['맥주']==0), '국가'].to_list()

#주류소비량이 정보가 없는 국가의 정보를 구해 봅니다.
df[df['주류소비량']==0]

#주류소비량 정보가 없는 국가 이름 목록(list) 만들기
df.loc[df['주류소비량']==0, '국가'].to_list()

#맥주 소비량의 값이 큰 5개 국가를 알아봅니다.
df.sort_values('맥주', ascending=False).head()

#맥주 소비량이 세계 평균 소비량보다 큰 국가의 개수는?
df.loc(df['맥주'] > df['맥주'].mean(), '국가').count()

 

 

 

10. 그룹별 통계치 구하기

  • df.groupby(컬럼명).통계함수() : 함수 적용 가능 컬럼들에 대해 그룹별 통계치를 구함
  • df.groupby(컬럼명)[컬럼명].통계함수() : 특정컬럼(들)에 대한 결과만 확인
    • [컬럼명] : 결과가 Series
      [[컬럼명]] : 결과가 DataFrame
      [[컬럼명1, 컬럼명2, ..]] : 결과 DataFrame
  • df.groupby(컬럼명)[컬럼명].agg([통계함수1, 통계함수2, ...])
#전세계 주류 소비량 평균
df.mean()

#대륙별 주류 소비량 평균을 계산해 봅니다.
df.groupby('대륙').mean()

#대륙별 주류 소비량 중앙값을 계산해 봅니다.
df.groupby('대륙').median()

#대륙별 맥주 소비량 평균은?
df.groupby('대륙')[['맥주']].mean()

#전세계 맥주 소비량 평균
df['맥주'].mean()

#전세계 맥주 소비량 평균보다 많은 맥주를 소비하는 대륙은?
temp = df.groupby('대륙')[['맥주']].mean()
temp[temp['맥주'] > df['맥주'].mean()]

#대륙별 맥주와 와인 소비량의 평균, 중앙값, 최대값은?
df.groupby('대륙')[['맥주','와인']].agg(['mean','median','max'])

 

 

 

행, 열에 모두 group을 지정하여 통계값 구하기

  • df.pivot_table(index=행 방향 컬럼, columns=열 방향 컬럼, values=집계 대상 컬럼, aggfunc=구할 통계값)
  • 각각에 대해 단독 또는 목록을 사용할 수 있음
  • index, columns = 범주형 / values = 연속형 
#pivot_table을 사용하여 대륙별(index), '맥주'와 '와인'의 mean, median, max 값을 구합니다.
df.pivot_table(index='대륙', values=['맥주','와인'], aggfunc=['mean','median','max'])

#pivot_table을 사용하여 대륙별(columns), '맥주'와 '와인'의 mean, median값을 구합니다.
df.pivot_table(columns='대륙', values=['맥주', '와인'], aggfunc=['mean', 'median'])

#groupby를 사용하여 대륙별, '맥주'와 '와인'의 mean, median, max 값을 구합니다.
df.gruopby('대륙')[['맥주', '와인']].agg(['mean','median','max'])
728x90
반응형