홍동이의 성장일기
[👩💻TIL 3일차 ] 유데미 스타터스 취업 부트캠프 4기 본문
목차
[42차시] 데이터프레임 연결하기(concat, merge)
[43차시] 행과 열의 형태 변경하기(melt, pivot)
[44차시] 피봇테이블로 데이터 집계하기(pivot_table)
[서울시 코로나19 현황분석]
[32차시] 인덱스, 컬럼명으로 데이터 추출하기
인덱스
숫자나 문자로 이루어진다
인덱스를 별도로 지정하지 않으면 0부터 1씩 증가하는 정수로 자동 지정된다
인덱스로 행 추출하기
→ 시리즈 형태로 추출 / 하나의 인덱스만 사용 가능
df.loc['i3']
→ 데이터프레임 형태로 추출 / 한 개 이상의 인덱스 사용 가능
df.loc[['i1','i3','i5']]
# 인덱스가 i3인 행을 데이터프레임 형태로 추출하기
df.loc[['i3']]
인덱스로 행, 열 추출하기
→ 한 개의 데이터
# 인덱스 i1의 kor점수
df.loc['i1','kor'] # 90.0
➡️ type: float64
→ 한 개의 행, 여러 컬럼
# 인덱스 i1 name, kor
df.loc['i1',['name','kor']]
➡️ type: Series
→ 여러 행, 한 개의 컬럼
# 인덱스 i1,i3,i5의 name
df.loc[['i1','i3','i5'],'name']
➡️ type: Series
→ 여러 행, 여러 컬럼
# 인덱스 i1,i3,i5의 name, kor
df.loc[['i1','i3','i5'],['name', 'kor']]
모든 행, 특정 열 추출하기
→ 한 개의 열
# 모든 행에서 'name' 가져오기
df.loc[:,'name']
# 모든 행에서 'name' 가져오기(데이터프레임)
df.loc[:,['name']]
→ 여러 열
# 모든 행에서 'name','math' 가져오기
df.loc[:,['name','math']]
[33차시] 행번호, 열번호로 데이터 추출하기
행번호로 행 추출하기
➡️ 시리즈 형태로 추출
df.iloc[0]
# 첫번째 행 추출하기(데이터프레임)
df.iloc[[0]]
df.iloc[[1,3,5]]
# 1~3행 추출하기
df.iloc[1:4]
# 1,3,5행 슬라이스
df.iloc[1:6:2]
# 1행 추출하기
df.iloc[1:2]
# 짝수 행번호의 데이터 추출하기
df.iloc[::2]
# 홀수 행번호의 데이터 추출하기
df.iloc[1::2]
➡️ 데이터프레임 형태로 추출
※ 음수를 사용하면 행번호를 뒤에서부터 센다.
# 마지막행 추출하기
df.iloc[-1]
# 마지막 2개 행 추출하기(리스트)
df.iloc[[-2,-1]]
# 마지막 2개 행 추출하기(슬라이스)
df.iloc[-2:]
행번호, 열번호로 행,열 추출하기
→ 한 개의 데이터
df.iloc[0,0]
→ 한 개의 행, 여러 열
df.iloc[0,[1,2]]
→ 여러 행, 한 개의 열
df.iloc[[1,3,4],1]
df.iloc[[1,3,4],[0,2]]
# 0,1번째 행 0,1번째 열 슬라이싱
df.iloc[:2, :2]
# 1,3,5번째 행 0,2번째 열 슬라이싱
df.iloc[1:6:2, :3:2]
# 마지막행 1,3열 슬라이싱
df.iloc[-1,1:4:2]
# 모든행, 1열
df.iloc[:,1]
# 모든행, 1,2열
df.iloc[:,[1,2]]
→ 여러 행, 여러 열
[34차시] 기본 그래프 그리기
matplotlib.pyplot
import matplotlib.pyplot as plt
- matplotlib 패키지의 pyplot 모듈 사용
- 관용적으로 plt라는 별칭 사용
- 데이터 준비하기
x축, y축에 들어갈 데이터를 준비한다. - 모듈의 메소드를 이용하여 그래프 그리기
여러 그래프를 겹쳐서 그릴 수 있다.
- 선그래프: plt.plot(x, y)
- 막대그래프: plt.bar(x, y)
- 가로 막대그래프: plt.barh(x, y)
- 산점도: plt.scatter(x, y, label='라벨')
plt.legend(): 범례표시
plt.show()
[옵션]
plt.title('제목', size=)
plt.xlabel('x축이름')
plt.ylabel('y축이름')
# 세가지 그래프를 한번에 그리고 옵션 추가하기
plt.scatter(x,y,label='scatter')
plt.bar(x,y,label='bar')
plt.plot(x,y,label='plot')
plt.title('Test Graph', size=15)
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
# kor을 막대그래프로 비교하기
df = pd.read_csv('data/scores.csv')
df.head()
x = df['name']
y = df['kor']
plt.bar(x,y)
plt.xticks(rotation=90)
plt.title('Scores', size=20)
plt.xlabel('name')
plt.ylabel('kor_score')
plt.show()
[35차시] 열 변경하기
열 추가/수정하기
컬럼이 존재하면 수정, 존재하지 않으면 추가된다.
# 학생 번호 추가하기 (1부터 시작하여 1씩 증가)
df['no'] = range(1,len(df)+1)
# 학생 번호 수정하기 (100부터 시작하여 1씩 증가)
df['no'] = df['no']+99
열 삭제하기
inplace = True: 삭제된 결과 데이터프레임에 적용
# no, sum 컬럼 삭제하기
df.drop(columns=['no','sum'], inplace=True)
#df = df.drop(columns=['no','sum'])
전체 컬럼명 변경하기
컬럼리스트의 항목수는 컬럼 개수와 동일해야 한다.
# name, kor, eng, math를 한글로 컬럼명 변경
df.columns=['이름','국어','영어','수학']
특정 컬럼명 변경하기
# 이름-->성명
df = df.rename(columns={'이름':'성명'})
[36차시] 행 변경하기
행 추가하기
- ignore_index = True: 기존 인덱스는 무시하고 새로운 인덱스가 생성된다.
- 데이터프레임의 끝에 행 추가
- 추가할 데이터는 딕셔너리 형태로 전달
df = df.append({'name':'Python','kor':80,'eng':90,'math':100}, ignore_index=True)
인덱스 지정하여 행 추가/수정
- 인덱스가 존재하면 해당 인덱스의 데이터 수정
- 인덱스가 존재하지 않으면 데이터프레임의 끝에 행 추가
# 인덱스 35에 추가
df.loc[35] = ['aaa',70,80,90]
행 삭제하기
# 30,34,35 삭제
df.drop(index=[30,34,35], inplace=True)
전체 컬럼명, 인덱스명 변경하기
df.index = range(100,3100,100)
특정 컬럼명, 인덱스명 변경하기
# 100-->'a', 200-->'b'
df.rename(index={100:'a',200:'b'}, inplace=True)
[37차시] 데이터에 함수 적용하기
함수로 컬럼의 데이터 변경하기
[함수 정의]
def 함수명(매개변수)
함수내용
return 결과값
[함수 적용]
- 컬럼.apply(함수명)
- 컬럼.apply(함수명, 매개변수명=매개변수값)
매개변수명을 명시해주어야 한다. - 적용할 함수가 미리 정의되어 있어야 한다.
#df['math']의 모든점수에 5점 더하기. 100점이 넘을 수 없다.
def plus5(x):
score = x+5
if score>=100:
score=100
return score
df_copy['math'] = df['math'].apply(plus5)
# 모든 점수에 n점 더하기. 100점이 넘을 수 없다.
def plusn(x,n):
score = x+n
if score>=100:
score=100
return score
# df['eng']의 모든 점수에 1점 더하기. 100점이 넘을 수 없다.
df_copy['eng'] = df['eng'].apply(plusn, n=1)
함수로 행/열의 데이터 집계하기
→ 열 단위⬇️로 함수를 적용하여 데이터를 집계한다.
# 과목 별 점수 합계
df_copy.loc['sum'] = df.apply(get_sum, axis=0)
→ 행 단위➡️로 함수를 적용하여 데이터를 집계한다.
# 행단위 데이터 출력
def print_me(x):
print(x)
df.apply(print_me, axis=1)
# 합계 구하기
def get_sum(x):
return x.sum()
# 학생 별 점수 합계
df_copy['sum'] = df.apply(get_sum, axis=1)
[38차시] 결측치 처리하기
결측치란
데이터 자체가 없다는 것을 의미한다.
결측치 확인하기
- df.isnull(): 결측치면 True, 결측치가 아니면 False 반환
- True는 1로 계산되어 sum하면 결측치의 개수를 확인할 수 있다.
결측치 삭제하기
데이터프레임.dropna()
: 결측치가 존재하는 모든 행 삭제
데이터프레임.dropna(axis=1)
: 결측치가 존재하는 모든 열 삭제
결측치 대치하기
데이터프레임의 모든 결측치를 지정한 값으로 대치
- 이전값으로 채우기 : 데이터프레임.fillna(method='ffill')
- 다음값으로 채우기 : 데이터프레임.fillna(method='bfill')
- 컬럼별로 값을 지정하여 치우기 : 데이터프레임.fillna({'컬럼명1':값1, '컬럼명2':값2,...})
# 0으로 채우기
df.fillna(0)
# 평균값으로 채우기(컬럼별 평균값으로 채워진다.)
df.fillna(df.mean())
# 이전값으로 채우기
df.fillna(method='ffill')
# 다음값으로 채우기
df.fillna(method='bfill')
# 컬럼별로 대치할 값을 지정하여 채우기
df.fillna({'A':0,'B':1,'C':2,'D':3})
결측치와 통계값
결측치는 없는 데이터로 간주한다.
→ 통계값을 구할 때 데이터의 개수에 영향을 끼친다.
[39차시] 자료형 변환하기
판다스 자료형
데이터타입 | 설명 |
int64 | 정수형 |
float64 | 실수형 |
bool | 부울형 |
object | 문자열 |
category | 카테고리 |
datetime64 | 날짜, 시간 |
판다스 자료형 확인하기
- 데이터프레임.dtypes
- 시리즈.dtype
- 한 시리즈에 문자열과 숫자, 문자열과 부울 등으로 데이터타입이 혼합되어 있으면 object형(str)으로 결정된다.
- 한 시리즈에 정수와 실수가 혼합되어 있으면 float64으로 결정된다.
판다스 자료형 변환하기
- 데이터프레임.astype('자료형')
- 시리즈.astype('자료형')
## 데이터프레임 전체 자료형 변환
# 실수형으로 변환
df = df.astype('float64')
# 정수형으로 변환 -> 바로 int로 불가
df = df.astype('float').astype('int')
## 컬럼의 자료형 변환
# col2의 자료형만 float로변환
df['col2'] = df['col2'].astype('float')
df.dtypes
※ 자료형이 혼합된 컬럼의 자료형을 변환할 때 변경할 수 없는 자료가 섞여있으면 error 발생
자료형이 혼합된 컬럼을 숫자형으로 변경
1. astype으로 변환
# 모든 값을 숫자로 변경할 수 있음
s1 = pd.Series(['1.0', '2', -3])
s1.astype('float')
# 숫자로 변경할 수 없는 데이터가 섞여있음
s2 = pd.Series(['1.0', '2', -3, 'a'])
s2.astype('float') # 에러 발생
2. to_numeric으로 변환
[에러처리옵션]
- ignore: 숫자로 변경할 수 없는 값이 있으면 작업하지 않음
- coerce: 숫자로 변경할 수 없는 값은 NaN로 설정
- raise: 숫자로 변경할 수 없는 값이 있으면 에러 발생 (default)
시계열 데이터로 변경
- astype으로 변환
: df['컬럼명'].astype('datetime64') - to_datetime으로 변환
: pd.to_datetime(df['컬럼명'])
[40차시] 카테고리형 자료 다루기
Category
- 특정 값들로만 이루어지는 자료형 ex. 성별, 혈액형, 학점
- 이런 경우 데이터를 문자형으로 관리하기보다는 카테고리 자료형을 사용하는 것이 용량&속도 면에서 더 효율적이다.
df['grade'] = df['grade'].astype('category')
df['grade'].cat.categories = ['A','B','C','D']
df['grade'] = df['grade'].cat.set_categories(['A','B','C','D','F'])
[41차시] 시계열 자료 다루기
datetime 자료형으로 변환하기
# 출생, 사망 컬럼을 datetime 자료형으로 변경하기
df['출생'] = pd.to_datetime(df['출생'])
datetime 자료형에서 정보 추출하기
컬럼.dt.year | 연 | 컬럼.dt.strftime('%a') | 요약요일명(Sun, Mon, ...) |
컬럼.dt.month | 월 | 컬럼.dt.strftime('%A') | 긴요일명(Sunday, Monday, ...) |
컬럼.dt.day | 일 | 컬럼.dt.strftime('%w') | 숫자요일(0: 일, 1: 월, ...) |
컬럼.dt.quarter | 분기 | 컬럼.dt.strftime('%b') | 요약 월이름(Jan, Feb, ...) |
컬럼.dt.strftime('%B') | 긴 월이름(January, February, ...) |
# 분기 컬럼 만들기
df['분기']=df['출생'].dt.quarter
# 출생요일 컬럼
df['출생요일'] = df['출생'].dt.strftime('%a')
날짜 계산하기
# 생존일수 컬럼 만들기
df['생존일수'] = df['사망']-df['출생']
# 생존기간 컬럼 만들기
df['생존기간'] = df['사망'].dt.year-df['출생'].dt.year
datetmie 자료형을 인덱스로 사용하기
# 1955년 출생한 데이터 추출하기
df.loc['1955']
# 1955년 2월 출생한 데이터 추출하기
df.loc['1955-02']
[42차시] 데이터프레임 연결하기(concat, merge)
데이터프레임 연결하기 (concat)
- pd.concat(데이터프레임리스트)
데이터프레임이 동일한 컬럼명 기준으로 행으로 연결된다. - pd.concat(데이터프레임리스트, axis=1)
데이터프레임이 동일한 인덱스 기준으로 열로 연결된다. - join = 'inner': 공통된 컬럼만 남기기
- ignore_index: 인덱스 재지정
df_rowconcat = pd.concat([df1,df2,df3], join='inner',ignore_index=True)
공통된 열을 기준으로 연결 (merge)
- pd.merge(left,right,on=기준컬럼,how=연결방법)
- 2개의 데이터프레임을 연결한다.
- how = 'inner': 공통 데이터만으로 연결 (default)
- how = 'outer': 모든 행 연결
- how = 'left' / 'right': 왼쪽/오른쪽 데이터프레임 기준으로 연결
⭐ 차이점
concat: 한번에 여러 개의 데이터프레임 연결 가능
※ default: outer join
merge: 한번에 두개의 데이터프레임 연결 가능
※ default: inner join
[43차시] 행과 열의 형태 변경하기(melt, pivot)
행을 열로 보내기 (melt)
모든 열 melt
- df.melt( )
- pd.melt(df)
- id_vars = [열이름리스트]: 고정할 컬럼 지정하여 melt
- value_vars = [열이름리스트]: 행으로 위치를 변경할 열 지정
- var_name = 컬럼명: value_vars로 위치를 변경한 열 이름
- value_name = var_name: 위치를 변경한 열의 데이터를 저장한 열 이름
- var_name = 컬럼명: value_vars로 위치를 변경한 열 이름
# name 고정
df.melt(id_vars='name')
# kor, eng 위치 변경
df.melt(id_vars='name', value_vars=['kor','eng'])
# subject, score 컬럼명 변경
df.melt(id_vars='name', value_vars=['kor','eng'], var_name='subject', value_name='score')
열을 행으로 보내기 (pivot)
- 데이터프레임.pivot( index=인덱스로 사용할 컬럼, columns=컬럼으로 사용할 컬럼, values=값으로 사용할 컬럼 )
# name, subject, score
df.pivot(index='name', columns='subject',values='score')
행, 열 바꾸기
- 데이터프레임.transpose()
[44차시] 피봇테이블로 데이터 집계하기(pivot_table)
- 피벗테이블은 표의 데이터를 요약하는 통계표이다.
- df.pivot_table(index=인덱스, columns=컬럼, values=집계할데이터, aggfunc=통계함수)
- aggrunc의 디폴트는 mean
[옵션]
- fill_value = 0: 결측값을 0으로 처리
- margins = True: 각각의 행과 열의 합계 확인 가능
# [item,color], size별 판매,재고 합계
df.pivot_table(index=['item','color'], columns='size', values=['sale','inventory'], aggfunc='sum', fill_value=0)
[45차시] 그룹별 데이터 집계하기(groupby)
그룹화하여 그룹별 데이터 집계하기
데이터프레임.groupby(그룹화 기준칼럼).통계적용컬럼.통계함수()
- count() : 누락값을 제외한 데이터 수
- size() : 누락값을 포함한 데이터 수
- mean() : 평균
- sum() : 합계
- std() : 표준편차
- min() : 최소값
- max() : 최대값
- sum() : 전체 합
※ to.frame(): Series 데이터를 Dataframe으로 바꾸기
# 객실등급(Pclass)별 승선자 수를 구한 결과를 데이터프레임 df1로 만들기
df1 = df.groupby('Pclass').Survived.count().to_frame()
# 객실등급(Pclass)별 생존자 수를 구한 결과를 데이터프레임 df2로 만들기
df2 = df.groupby('Pclass').Survived.sum().to_frame()
그룹에 사용자정의함수 적용하기
df.groupby(그룹기준컬럼).통계적용컬럼.agg(사용자정의함수,매개변수들)
def my_mean(values):
return sum(values)/len(values)
df.groupby(['Sex','Pclass']).Survived.agg(my_mean)
그룹 오브젝트 출력하기
- 데이터프레임.groupby(그룹기준컬럼).groups → 그룹별 인덱스:[데이터리스트] 출력
- 데이터프레임.groupby(그룹기준컬럼).get_group(그룹인덱스) → 그룹별 인덱스에 해당하는 데이터프레임 출력
[서울시 코로나19 현황분석]
[46차시] 데이터 준비하기
그래프를 그리기 위한 설정
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'NanumGothic'
- csv파일로 데이터프레임을 만드는 경우 첫번째 행이 컬럼명이어야 한다.
- csv파일은 ,(콤마)로 구분되기 때문에 값에 ,가 있으면 안된다.
- csv을 UTF-8로 저장하는 방법
- [다른 이름으로 저장] - [CSV UTF-8(쉼표로 분리)(* csv)로 저장]
- [우클릭] - [연결 프로그램] - [메모장] - [다른 이름으로 저장] - [인코딩: UTF/UTF-8(BOM)]
[47차시] 데이터 확인 및 전처리
## 데이터 불러오기
df = pd.read_csv('data/서울시 코로나19 확진자 현황.csv', low_memory=False)
## 데이터 확인 및 전처리
# nan만 있는 컬럼 확인 및 삭제
df['이동경로'].unique()
# 불필요한 컬럼 삭제
df.drop(columns=['환자번호','국적','환자정보','조치사항','이동경로','등록일','수정일','노출여부'], inplace=True)
## 자료형 변환
# 확진일 --> datetime
df['확진일'] = pd.to_datetime(df['확진일'])
print(df['확진일'].head())
# 지역 공백 제거(by 문자열 처리 함수)
df['지역'] = df['지역'].str.strip()
# 지역&상태 --> category
df['지역'] = df['지역'].astype('category')
df['상태'] = df['상태'].astype('category')
## 결측치 분석
#여행력에만 결측값이 있음 but 어쩔수없기 때문에 남겨둠
df.isnull().sum()
드디어 본격적인 데이터 분석에 들어간다!
처음보거나 헷갈리는 개념이 많았지만 유용하게 사용할 수 있을 것 같다.
어제의 질문에 대해서는 명확한 해답을 듣지 못했다 ㅜㅜ
오늘 새로운 노트북에 다시 설치해봐야겠다
오늘의 질문
concat은 한번에 여러 개의 데이터프레임 연결이 가능하고
merge는 한번에 두 개의 데이터프레임만 연결이 가능하다고 설명해주셨는데,
두가지를 구분하여 사용하는 이유가 궁금합니다.
해답
사용 방법이 다르다!
concat은 행과 컬럼명을 기준으로 데이터프레임을 연결하고
merge는 열을 기준으로 데이터프레임을 연결하는 것!
내일도 화이팅!!
* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL
* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb
📌 본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.
'교육 > 유데미 스타터스 4기' 카테고리의 다른 글
유데미 스타터스 취업 부트캠프 4기 - 데이터분석/시각화(태블로) 1주차 학습 일지 (0) | 2023.02.10 |
---|---|
[👩💻TIL 5일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.02.10 |
[👩💻TIL 4일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.02.09 |
[👩💻TIL 2일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.02.07 |
[👩💻TIL 1일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.02.06 |