Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

여유로움

[11.21 일] 빅데이터 분석기사 실기 - Pandas (10~16강) 본문

셀프스터디/빅데이터 분석기사

[11.21 일] 빅데이터 분석기사 실기 - Pandas (10~16강)

티로즈 2021. 11. 21. 19:25

1. CSV 파일 가져오기

csv 파일 가져오기
  • csv 파일은 컬럼 구분이 콤마(,) 로 이루어진 파일
  • df = pd.read_csv(파일이름) : csv 형식의 파일을 읽어 DataFrame 객체로 가져옴
  • DataFrame.to_csv(파일이름, index=True) : DataFrame을 csv 파일로 저장, index는 제외하고 저장하기 위해서는 index=False로 지정
# [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. 결측치 확인

결측치
  • 값이 없음을 나타냄
  • NaN, NaT, None 등으로 표기되며, NA Value, Missing Value 라고 함
결측치 확인
  • DataFrame.isna() : 결측치에 대해 True, 아니면 False
  • DataFrame.isnull() : DataFrame.isna()와 동일함
  • DataFrame.notna() : 결측치가 아닌 것에 대해 True, 결측치면 False
  • DataFrame.notnull() : DataFrame.isnull()과 동일함
  • Series에도 결측치 확인을 위한 isna() ~ notnull()의 메서드 있음
  • DataFrame.isna().sum() : 결측치에 대해 컬럼별 개수

데이터 종류 확인
  • 주로 범주형 데이터에 사용함
    • 성별, 지역, 부서 등의 몇 개의 그룹으로 표현되는 데이터
    • 숫자 또는 문자열로 표현 될 수 있음
  • Series.unique() : 결측치를 포함하며, 중복을 제외한 데이터의 종류를 ndarray로 반환
  • Series.value_counts() : 결측치를 포함하지 않으며, 데이터 종류별 개수를 Series로 반환
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. 결측치 해결 방법

결측치 해결방법
  • pd.read_csv(파일이름, na_filter=False) : NA를 NaN(결측치)로 읽는 동작을 멈추게 합니다.
  • 옵션 확인 : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.htm
  • DataFrame.fillna(값) : 결측값을 특정 값으로 채우기 합니다.
  • Series.fillna(값) : 결측값을 특정 값으로 채우기 합니다.
    • 연속형 데이터 : 0으로 채우기, 평균값으로 채우기, 범주별 평균값 채우기 등
    • 범주형 데이터 : 다른 범주로 만들어 채우기
  • DataFrame.loc[Series.isna(), 컬럼명] = 값
# [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. 통계치 구하기

  • DataFrame.describe() : 숫자형 데이터타입을 갖는 컬럼에 대해 count, mean, std, min, max, Q1, Q2, Q3 등의 통계값 구하기
  • DataFrame.count() : 개수
  • DataFrame.sum() : 합계
  • DataFrame.mean() : 평균
  • DataFrame.std() : 표준편차
  • DataFrame.var() : 분산
  • DataFrame.quantile() : 분위수
  • DataFrame.함수(axis=1)을 사용하여 행별 통계값을 구할 수 있음
    • axis=0 : 기본값이며, 행을 이동하며, 행과 행의 연산을 수행함
    • axis=1 : 컬럼을 이동하며 컬럼과 컬럼의 연산을 수행함
# [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.250.50.75])
temp.index = ['Q1''Q2''Q3']
print(temp)
# [2-20] df (object dtype이 존재함) 에 대해서 컬럼별 min을 구해 봅니다.
# dtype이 object이 컬럼의 min은 오름차순 정렬시 가장 앞에 있는 것
# dtype이 object이 컬럼의 max는 오름차순 정렬시 가장 뒤에 있는 것
# 문자열 정렬시에는 문자의 코드값을 사용함 : ord(문자)
각 컬럼 별 함수 적용
  • DataFrame.apply(함수) : Series로 결과가 반환됨
  • DataFrame.apply([함수1, 함수2, ...]) : DataFrame으로 결과가 반환됨
  • 사용자 정의 함수, 외부 함수, 내장 함수 등 다양한 함수를 사용할 수 있음
  • Series의 통계 함수들은 문자열 형태로 사용할 수 있음 : 'min', 'max', 'count', 'std', 'var', 'mean', 'median'
# [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의 연산
  • Series 끼리 또는 Series와 스칼라는 다양한 연산을 할 수 있음
  • index에 맞춰 element wise 연산됨
    • 산술연산(수치): +, -, *, /, //, %
    • 비교연산(True/False): >, <, >=, <=, ==, !=
    • True/False의 관계연산(True/False): &, |, ~
# [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에 새로운 컬럼 추가
  • DataFrame[컬럼명] = 데이터목록
  • 컬럼명은 기존 DataFrame에 존재하지 않는 이름이어야 함
  • 데이터목록은 DataFrame의 다른 컬럼들과 같은 개수이어야 하며 list, Series 등의 형태일 수 있음
DataFrame의 컬럼 제거
  • del DataFrame[컬럼명]
  • DataFrame.drop(컬럼명, axis=1), DataFrame.drop([컬럼명1, 컬럼명2, ...], axis=1)
  • DataFrame.drop(columns=[컬럼명...])
DataFrame의 행 제거
  • axis=0 이 기본값이므로 생략하여도 됨
  • DataFrame.drop(행이름), DataFrame.drop([행이름1, 행이름2, ...])
  • DataFrame.drop(rows=[행이름1, 행이름2 ...])
# [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. 컬럼<--> 인덱스 전환

  • DataFrame.set_index(컬럼명) : 지정한 컬럼을 index로 지정함
  • DataFrame.set_index([컬럼명1, 컬럼명2, ...]) : 컬럼 목록을 index(Multi Index)로 지정함
    • columns에서 index 쪽으로 이동됨, 기존 index는 제거됨
  • DataFrame.reset_index() : 모든 index 가 columns로 이동됨
    • index는 RangeIndex로 대체됨
# [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에서 특정 행,열 제거

  • DataFrame.drop(행, axis=0)
  • DataFrame.drop([행1, 행2, ...], axis=0)
  • DataFrame.drop(열, axis=1)
  • DataFrame.drop([열1, 열2, ...], axis=1)
  • indexing을 사용하여, 제거할 정보가 아닌 필요한 정보를 가져오기 하여 특정 행/열 제거
# [2-36] korea 정보 중에서 대륙 정보를 제거합니다.
korea.drop('대륙',axis = 1)

 

9. 원하는 컬럼만 추출

  • DataFrame.loc[:, 시작컬럼명:끝컬럼명]
  • DataFrame.iloc[:, 시작컬럼번호:끝컬럼번호+1]
    • 특정 번호부터 끝까지 모든 컬럼을 대상으로 하며면 끝컬럼번호+1 정보를 생략함
# [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의 행/열 전환
  • DataFrame.T : index, columns의 위치가 바뀜
# [2-41] worldwide의 행과 열을 전환해 wwT로 저장합니다.
wwT = worldwide.T
wwT
DataFrame의 임의 위치 열 삽입
  • DataFrame.insert(위치, 컬럼, 값) : inplace 동작됨 (새로운 return 없음)
# [2-42] wwT의 맨 앞에 '국가' 컬럼을 'World Wide' 값으로 추가합니다.
# 여러 번 추가하면 안됨
wwT.insert(0,'국가','World Wide')
wwT
wwT.drop()
DataFrame의 행(들) 추가
  • DataFrame.append(DataFrame) : 새로운 DataFrame 반환
  • 2개를 1개로 합치는 작업 가능
# [2-43] korea 뒤에 wwT를 추가하여 compT 로 이름 붙입니다
compT = korea.append(wwT)
compT
여러 개의 DataFrame을 합쳐 하나의 DataFrame 생성
  • pd.concat([df1, df2, ....], axis=0) : index 방향으로 합치기
  • pd.concat([df1, df2, ....], axis=1) : columns 방향으로 합치기
  • DataFrame.append()와는 달리 여러 개의 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. 그룹별 통계치

그룹별 통계치 구하기
  • DataFrame.groupby(컬럼명).적용할통계함수()
    • DataFrame의 함수 적용 가능 컬럼들에 대해 그룹별 통계치를 구함
    • 통계함수에는 sum, mean, std, var, min, max, count, quantile 등이 있음
  • DataFrame.groupby(컬럼명)[컬럼명].적용할통계함수()
    • 특정 컬럼(들)에 대한 결과만 확인할 때
    • [컬럼명] : 결과가 Series
    • [[컬럼명]] : 결과가 DataFrame
    • [[컬럼명1, 컬럼명2, ..]] : 결과 DataFrame
  • DataFrame.groupby(컬럼명)[컬럼명].agg([통계함수1, 통계함수2 , ...])를 사용함
    • 여러 개의 통계함수를 적용
    • 통계함수를 문자열 형식으로 사용 가능
# [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 설정하여 통게값 구하기

  • DataFrame.pivot_table(index=행방향컬럼, columns=열방향컬럼, values=집계대상컬럼, aggfunc=구할 통계값)
  • 각각에 대해 단독 또는 목록을 사용할 수 있음
  • index, columns는 범주형, values는 연속형 사용
# [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