오늘의 회고
사실(Fact) : Plotly 마무리, 판다스 문법 & 시각화 실습 (코로나 확진자 공공데이터)
느낌(Feeling) : 판다스 문법을 복습해서 좋았고, 배울 수록 유용해보여서 더 잘하고싶다.
교훈(Finding) : 이번주 수업 복습 꼼꼼히! 블로그 TIL 밀린 것 잘 정리해보자!
중복확인, 제거
duplicated()
drop_duplicates()
유니크값의 개수(nuniqur)
.nunique()
유니크(unique)
df["퇴원현황"].unique() #unique값에는 nan(결측치)은 포함되지 않는다
unique()는 serise에만 사용 가능하고 nunique()는 dataframe, series에 모두 사용 가능
인덱스 설정, 정렬하기
- set_index
→ 인덱스로 지정하면 컬럼이 아니게 된다.
→ index의 name이 “컬럼1”
→ df =df.set_index(”컬럼1”)
→ 반복실행 시 오류가 날 수 있다.
- sort_index (역순은 ascending=False)
데이터타입확인
df.dtypes
기술통계
describe()
describe(include="object")
top 최빈값
freq 최빈값의 빈도수
Accessor
특정 데이터 타입에 사용하는 Accessor(명령어 느낌), 주로 dt를 날짜형 데이터, str을 문자열 데이터 전처리에 활용한다
https://pandas.pydata.org/docs/reference/series.html#datetimelike-properties
- dt
- str
- cat
- sparse
파생변수만들기
날짜를 → 연, 월, 요일로, dt 활용
df["연도"] = df["확진일"].dt.year
df["월"] = df["확진일"].dt.month df["일"] = df["확진일"].dt.day df["요일"] = df["확진일"].dt.dayofweek
연도-월 파생변수 만들기
1.문자열로 붙이기
astype(str) 을 통해 수치 데이터를 문자 데이터로 변환하고 문자열 연결하기
df["연도월"]
df["연도"].astype(str)+"-"+df["월"].astype(str)
문자열 슬라이싱 (이 방법 더 추천)
df["연도월"] = df["확진일"].astype(str).str[:7]
요일구하는함수
#find_dayofweek 함수로 요일 숫자를 넘겨주면 요일명을 반환하는 함수
def find_dayofweek(day_no):
dayofweek = "월화수목금토일"
return dayofweek[day_no]
함수 map하기
# map을 사용해서 요일 컬럼을 요일명으로 변환하고 "요일명"이라는 새로운 컬럼에 저장하기
df["요일명"] = df["요일"].map(find_dayofweek)
람다함수 사용하기
'''
lambda 반환값 : 식
'''
lambda x: x+10
def add10(x):
return x+10
#익명함수 lambda로 요일구하기
df["요일"].map(lambda x: "월화수목금토일"[x])
"연도" 컬럼을 통해 빈도수 구하기"연도" 컬럼의 비율 구하기빈도수 구하기
- 한 개의 변수 : series.value_counts()
- 두 개의 변수 : pd.crosstab()
- groupby 와 pivot_table
정규화(normalize)와 표준화
df["연도"].value_counts(normalize=True)
df["연도"].value_counts()
전처리 적용이 제대로 되지 않을때
1. 데이터 타입 확인해보기
df.index.dtype
2. 데이터 타입 변경
day_count.index = pd.to_datetime(day_count.index)
만약 전체 날짜를 포함시켜 빈도를 구하려면?
1. 전체 날짜로 늘린다 (리스트를 데이터프레임으로 변경)
2. 날짜가 인덱스인 새 데이터프레임에 기존 데이터를 새 컬럼으로 넣는다
3. 결측치 데이터를 0으로 바꿔준다
누적 수치 구하기(.cumsum())
df_all_day["누적확진수"] = df_all_day["확진수"].cumsum()
특정 문자를 포함하는 데이터 계산하기 (str.contatins)
df[df["접촉력"].str.contains("이태원") & (df["월"] == 6)]