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. 결측치 해결 방법
- NA(값)를 NaN(결측치)로 읽는 동작을 멈추게 함
- pd.read_csv(파일이름, na_filter=False) : 파일에서 데이터를 불러올 때 결측치로 인지되는 데이터를 자동으로 결측치로 읽어오는 동작을 멈추게 함
- 결측치를 다른 값으로 채우기 함
- df.fillna(값) / series.fillna(값) : 결측값을 특정 값으로 채우기
- 연속형 데이터 : 0으로 채우기, 평균값으로 채우기, 범주별 평균값 채우기 등
- 범주형 데이터 : 다른 범주로 만들어 채우기
- df.loc[series.isna(), 컬럼명]=값
- df.fillna(값) / series.fillna(값) : 결측값을 특정 값으로 채우기
# 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
- [컬럼명] : 결과가 Series
- 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
반응형
'PYTHON > 빅데이터분석기사' 카테고리의 다른 글
ML_02 (Introduction s3-05~09 붓꽃 품종 예측 / sklearn lib) (0) | 2023.11.13 |
---|---|
ML_01-1 (basic s3-03 자녀의 키 예측하기) (0) | 2023.11.10 |
ML_01 (basic s3-01~02) (0) | 2023.11.05 |
Pandas-03 (fine_dust s2-17~23) / 미세먼지 분석 다시(파일 오류로 끊음 영상 s2-23) (0) | 2023.11.05 |
Pandas-01 (youtube s2-02~09) (0) | 2023.11.04 |