여유로움
[11.21 일] 빅데이터 분석기사 실기 - Pandas (10~16강) 본문
1. CSV 파일 가져오기
csv 파일 가져오기
|
# [2-1] drinks.csv 파일을 DataFrame으로 불러오기 합니다.
df = pd.read_csv('./data_01/drinks.csv')
# [2-2] df의 데이터 모습을 확인하기 위해 첫 5개 데이터를 출력합니다
df.head(5)
# [2-3] df의 컬럼명을 한글로 변경합니다.
# ['국가', '맥주', '증류주', '와인', '알코올','대륙']
df.columns = ['국가', '맥주', '증류주', '와인', '알코올','대륙']
# 변경되었는지 확인합니다.
df.head()
# [2-4] df의 row의 개수 및 각 column의 정보 및 메모리 사용량을 확인합니다.
df.info(memory_usage='deep')
|
2. 결측치 확인
결측치
|
데이터 종류 확인
|
df.isna().sum() #all로 하면 전체에 대한 T/F 여부가 나와서 판별이 어려움
# [2-5] 대륙의 종류를 알아봅니다
# 결과를 보면 csv파일에서 'NA'로 되어 있는 데이터를 NaN(=nan)으로 가져온 것입니다.
df['대륙'].unique()
# [2-6] 대륙별 개수를 알아봅니다.
df['대륙'].value_counts()
# [2-7] 결측치를 컬럼 별로 집계해 봅니다.
df.isna().sum()
# [2-8] isna()를 사용해 대륙에서 결측치로 취급된 데이터만 출력해 봅니다
# 북아메리카(NA)에 포함되는 국가들인 것을 확인할 수 있습니다.
df[df['대륙'].isna()]
|
3. 결측치 해결 방법
결측치 해결방법
|
# [2-9] 해결방법 1
# read_csv의 옵션을 사용하여 해결합니다.
# read_csv에서 'NA'를 NaN으로 읽도록하는 동작을 멈추게 합니다.
# na_filter=False 를 사용하면 NA를 NaN으로 읽지 않습니다.
df2 = pd.read_csv('./data_01/drinks.csv', na_filter=False)
# [2-10] df2의 'continent' (대륙)에 포함된 값의 종류를 unique를 사용해 살펴 봅니다
# NaN 대신 'NA'가 있는 것을 확인할 수 있습니다.
df2['continent'].unique()
#위와 동일한 처리 방법
df.loc[df'대륙'].isna(), '대륙'] = 'NA'
df = df.fillna('NA')
# [2-10] 해결방법 2
# NaN으로 읽어온 데이터를 'NA'로 변경합니다.
df['대륙'] = df['대륙'].fillna('NA')
# [2-11] 결측치가 제거 되었는지 컬럼 별 결측치 개수를 출력해 확인합니다.
df.isna().sum()
# [2-12] unique()를 사용하여 '대륙'의 종류를 확인해 봅니다.
df['대륙'].unique()
|
4. 통계치 구하기
|
# [2-13] describe 함수를 사용해 전세계 맥주, 증류주, 와인, 알코올 소비에 대한 통계치를 구해봅니다.
df.describe() #통계치는 수치형 자료만 있는 데이터만 나온다
temp = df[['국가', '대륙']]
temp.describe()
# [2-14] 전세계 맥주, 증류주, 와인, 알코올 소비에 대한 정보만 추출하여 df2로 지정합니다.
df2 = df[['맥주', '증류주', '와인', '알코올']]
df2
# [2-15] 전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) '평균'만 구해봅니다.
df2.mean()
# [2-19] 전세계 맥주, 증류주, 와인, 알코올의 소비에 대한 (df2) Q1, Q2, Q3를 구해봅니다.
temp = df2.quantile([0.25, 0.5, 0.75])
temp.index = ['Q1', 'Q2', 'Q3']
print(temp)
# [2-20] df (object dtype이 존재함) 에 대해서 컬럼별 min을 구해 봅니다.
# dtype이 object이 컬럼의 min은 오름차순 정렬시 가장 앞에 있는 것
# dtype이 object이 컬럼의 max는 오름차순 정렬시 가장 뒤에 있는 것
# 문자열 정렬시에는 문자의 코드값을 사용함 : ord(문자)
|
각 컬럼 별 함수 적용
|
# [2-21] df2의 각 컬럼별 평균을 구해 봅니다.
df2.apply(['mean'])
# [2-22] df2의 최소, 최대, 평균값을 구해봅니다.
df2.apply(['min','max','mean'])
|
5. 데이터 비교
# pandas의 max_rows, max_columns 설정
pd.set_option('display.max_rows', 200)
pd.set_option('display.max_columns', 10)
# https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html
Series의 연산
|
# [2-23] 와인 소비량이 맥주 + 증류주 소비량보다 큰 나라를 검색해,'대륙'을 기준으로 정렬해 보자
df[df['와인'] > df['맥주']+df['증류주']].sort_values('대륙')
# [2-24] 맥주 소비량이 230 초과이면서, 와인 소비량이 230 초과인 나라를 검색해 보자
df[(df['맥주']>230) & (df['와인']>230)]
# [2-25] 대륙이 'AS'인 국가들의 정보를 검색해 보자
df[df['대륙']=='AS'].sort_values('국가')
|
6. 컬럼 추가 및 제거
DataFrame에 새로운 컬럼 추가
|
# [2-26] 국가별 주류 소비량 합계를 구해 새로운 컬럼 ('주류소비량')를 추가합니다
# 주류소비량 = '맥주' + '증류주' + '와인'
df['주류소비량'] = df['맥주']+df['증류주']+df['와인']
df.head().sort_values('주류소비량',ascending=False)
# [2-27] 주류소비량2 = ['맥주', '증류주', '와인']에 대해 DataFrame.sum(axis=1) 함수 사용
df['주류소비량2'] = df[['맥주', '증류주','와인']].sum(axis=1)
# [2-28] 주류 소비량 대비 알코올 소비량 비율을 구해 새로운 컬럼 ('알코올비율')을 추가합니다.
# 알코올비율 = '알코올' / '주류소비량'
df['알코올비율'] = df['알코올']/df['주류소비량']
df.head()
# [2-29] 알코올비율이 높은 국가 TOP5의 ['국가', '주류소비량', '알코올비율'] 정보를 구해 봅니다.
# HINT) sort_values, indexing 사용
df[['국가', '주류소비량', '알코올비율']].sort_values('알코올비율',ascending=False).head()
# [2-30] '주류소비량2' 컬럼을 제거하여 봅니다.
#df = df.drop('주류소비량2', axis=1)
#df = df.drop(columns=['주류소비량2'])
df.drop('주류소비량2', axis=1)
del df['주류소비량2']
# [2-31] '알코올비율'이 NaN인 것에 대해 0으로 채우기 합니다.
df['알코올비율'] = df['알코올비율'].fillna(0)
|
7. 컬럼<--> 인덱스 전환
|
# [2-32] 국가별 주류 소비량 합계(맥주, 증류주, 와인의 합)를 구해 봅니다.
df.set_index('국가')[['맥주','증류주','와인']].sum(axis=1)
# [2-33] df를 ['대륙', '국가']를 index로 지정하고, 대륙별, 국가명으로 정렬하여 df로 저장합니다.
df = df.set_index(['대륙', '국가']).sort_index()
df
# [2-34] df의 index를 모두 columns로 이동합니다.
df = df.reset_index()
# [2-35] 전세계 평균 소비량과 한국('South Korea')의 소비량을 비교해 보려고 합니다.
# 먼저, 한국의 소비량을 조회하여 korea로 저장합니다.
korea = df[df['국가']=='South Korea']
korea
|
8. DataFrame에서 특정 행,열 제거
|
# [2-36] korea 정보 중에서 대륙 정보를 제거합니다.
korea.drop('대륙',axis = 1)
|
9. 원하는 컬럼만 추출
|
# [2-37] indexing을 사용하여 korea 정보 중 대륙 정보를 제거합니다. (DataFrame.loc[])
korea.loc[:, '국가':'알코올비율']
# [2-38] indexing을 사용하여 korea 정보 중 대륙 정보를 제거합니다. (DataFrame.iloc[])
korea.iloc[:,1:]
# [2-39] korea에 대륙 정보가 제거된 정보를 다시 저장합니다.
korea = korea.drop('대륙',axis = 1)
korea
# [2-40] 세계의 각 컬럼별 평균을 구하여 DataFrame으로 만들고,
# worldwide라는 이름을 지정합니다
# 세계의 각 컬럼별 평균은 DataFrame.mean()을 사용합니다.
worldwide = pd.DataFrame(df.mean()) #mean을 쓰면 Series 형태이므로 DataFrame으로 형변환 해줌
worldwide
|
10. DataFrame 행/열 전환 및 행/열 삽입
DataFrame의 행/열 전환
|
# [2-41] worldwide의 행과 열을 전환해 wwT로 저장합니다.
wwT = worldwide.T
wwT
|
DataFrame의 임의 위치 열 삽입
|
# [2-42] wwT의 맨 앞에 '국가' 컬럼을 'World Wide' 값으로 추가합니다.
# 여러 번 추가하면 안됨
wwT.insert(0,'국가','World Wide')
wwT
wwT.drop()
|
DataFrame의 행(들) 추가
|
# [2-43] korea 뒤에 wwT를 추가하여 compT 로 이름 붙입니다
compT = korea.append(wwT)
compT
|
여러 개의 DataFrame을 합쳐 하나의 DataFrame 생성
|
# [2-44] wwT와 korea 를 합쳐 하나의 DataFrame을 생성하여 df2로 저장합니다.
df2 = pd.concat([korea,wwT])
df2
# [2-45] df2를 '국가' 컬럼을 index로 설정하여 df3으로 저장합니다
df3 = df2.set_index('국가')
df3
# [2-46] df3의 행,열을 전환하여 출력합니다.
df3.T
|
11. Indexing
# [2-47] 주류소비량이 있으면서, 맥주를 소비하지 않는 나라의 맥주, 증류주, 와인, 알코올, 대륙 등 모든 정보를 구해 봅니다.
# indexing 사용
df[(df['주류소비량']>0) & (df['맥주']==0)]
df.loc[(df['주류소비량']>0) & (df['맥주']==0),:]
# [2-48] 주류소비량이 있으면서, 맥주를 소비하지 않는 국가의 국가명 목록을 구해봅니다.
df.loc[(df['주류소비량']>0) & (df['맥주']==0), '국가'].to_list()
|
# [2-49] 주류소비량이 정보가 없는 국가의 정보를 구해 봅니다.
df.loc[df['주류소비량']==0,'국가'].to_list() #loc의 결과가 Series로 나오므로 to_list
# [2-50] 맥주 소비량의 값이 큰 5개 국가를 알아봅니다.
df.sort_values('맥주',ascending=False).head(5)
# [2-51] 맥주 소비량이 세계 평균 소비량보다 큰 국가의 개수는?
df.loc[df['맥주'] > df['맥주'].mean(),'국가'].count()
|
12. 그룹별 통계치
그룹별 통계치 구하기
|
# [2-52] 전세계 주류 소비량 평균
df.mean()
# [2-53] 대륙별 주류 소비량 평균을 계산해 봅니다.
df.groupby('대륙').mean() #groupby(범주)
# [2-55] 대륙별 맥주 소비량 평균은?
df.groupby('대륙')[['맥주']].mean() #목록으로 주면 DataFrame으로 출력됨
# [2-56] 전세계 맥주 소비량 평균보다 많은 맥주를 소비하는 대륙은?
temp = df.groupby('대륙')[['맥주']].mean()
temp[temp['맥주'] > df['맥주'].mean()]
# [2-57] 대륙별 맥주와 와인 소비량의 평균, 중앙값, 최대값은?
df.groupby('대륙')[['맥주','와인']].agg(['mean', 'median', 'max'])
|
13. 행/열 모두 groupby 설정하여 통게값 구하기
|
# [2-58] pivot_table을 사용하여 대륙별(index), '맥주'와 '와인'의 mean, median, max 값을 구합니다.
# 결과 참조
df.pivot_table(index='대륙', values=['맥주','와인'], aggfunc=['mean', 'median', 'max'])
# [2-59] pivot_table을 사용하여 대륙별(columns), '맥주'와 '와인'의 mean, median값을 구합니다.
# 결과 참조
df.pivot_table(columns='대륙', values=['맥주', '와인'], aggfunc=['mean', 'median'])
# [2-60] groupby를 사용하여 대륙별, '맥주'와 '와인'의 mean, median, max 값을 구합니다.
df.groupby('대륙')[['맥주', '와인']].agg(['mean', 'median', 'max'])
|
출처 : 유튜브 채널 EduAtoZ
'셀프스터디 > 빅데이터 분석기사' 카테고리의 다른 글
[11.24 수] 빅데이터 분석기사 실기 - Pandas (24~29강) (0) | 2021.11.24 |
---|---|
[11.23 화] 빅데이터 분석기사 실기 - Pandas (21~23강) (0) | 2021.11.23 |
[11.22 월] 빅데이터 분석기사 실기 - Pandas (17~20강) (0) | 2021.11.22 |
[11.17 수] 빅데이터 분석기사 실기 - Pandas (6~9강) (0) | 2021.11.17 |
[11.16 화] 빅데이터 분석기사 실기 - Pandas (1~5강) (0) | 2021.11.16 |