📘 Tech Learning/Pandas
📘 [Tech/Pandas] 빅데이터분석기사 - 작업형#1 정리
혜덕hyeduck
2024. 6. 18. 23:58
※ 본 게시물은 인프런 강의 퇴근후딴짓 빅분기 실기 강의 내용을 토대로 정리했습니다.
[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3) 강의 | 퇴근후딴짓 - 인프런
퇴근후딴짓 | 비전공자, 입문자가 빅데이터 분석기사 실기를 빠르게 취득할 수 있도록 안내해드려요! 꼭 필요한 파이썬, 판다스, 머신러닝을 다루고 있어요!, ❤️공지❤️ 7회 기출 유형 업데이
www.inflearn.com
라이브러리 & 데이터 불러오기
라이브러리 불러오기
import panadas as pd
import numpy as np
데이터 불러오기 & 변수에 담기
- pd.read_csv()
df = pd.read_csv('파일명.csv')
데이터 샘플링 확인
- 데이터프레임.head(), 데이터프레임.tail()
df.head() # 앞에서부터(기본 5개)
df.tail() # 뒤에서부터
데이터 프레임과 시리즈
시리즈 만들기
- pd.Series([리스트])
menu = pd.Series(['A', 'B', 'C'])
데이터 프레임 만들기
- pd.DataFrame({”컬럼명” : 데이터})
df = pd.DataFrame(
{
'menu' : menu,
'price' : [1000, 2000, 3000],
}
)
시리즈 선택(열/칼럼 선택)
df['칼렴명']
특정 열의 데이터 프레임 선택
df[['칼럼명']]
데이터 프레임 type 확인
type('데이터프레임 명')
시리즈 type 확인
type(df['칼럼명'])
탐색적 데이터 분석
데이터 프레임 크기 확인
df.shape #(행크기, 열크기)
df.shape[0] #행크기
df.shape[1] #열크기
칼럼 타입 확인
df.info()
기초 통계 확인 : 숫자타입
df.describe()
기초 통계 확인 : object 타입
- count : 데이터 개수
- unique : 고유값 수
- top : 가장 많이 등장하는 값
- freq : 전체 데이터에서 top에 나온 value 개수
df.describe(include='O')
상관관계
- 코랩에서는 numeric_only=True 추가해야함 (시험에서는 X)
- 칼럼들간 상관 계수 계산
- 1 : 양
- -1 : 음
- 0 : 관계 없음
df.corr()
# 코랩 pandas에서는..
df.corr(numeric_only = True)
항목 종류 개수
- 데이터 프레임, 시리즈(특정 칼럼)의 고유 값 개수카운트
df.nunique()
df['칼럼명'].nunique()
항목 종류
- 시리즈(특정 칼럼)의 고유 값들 반환 ex)sedan, suv…
df['칼럼명'].unique()
항목별 개수 카운트
- 시리즈(특정 칼럼)의 고유 값 빈도수 계산
- 즉, 각 항목이 몇 개씩인지 보여줌 ex) sedan 7, suv 9….
df['칼럼명'].value_counts()
자료형 변환
자료형 변환
- 만약 할인율 칼럼이 object 타입인데, float 타입으로 변환하고 싶다면
df['할인율'] = df['할인율'].astype('float')
- 이때 다시 칼럼에 대입해주지 않으면 원본 데이터프레임에 반영 안 됨!!!
새로운 칼럼 추가
새로운 칼럼 추가
- 만약 가격에 할인율을 반영한 할인가 칼럼을 추가하고 싶다면
df['할인가'] = df['가격'] * (1 - df['할인율'])
- 만약 결측값을 대입한 원두 칼럼을 추가하고 싶다면
import numpy as np df['원두'] = np.nan
데이터 삭제
칼럼(열) 삭제 : axis = 1
- 역시나 원본 데이터프레임에 반영하고 싶다면 대입해야함
df = df.drop('칼럼명', axis = 1)
데이터(행) 삭제 : axis = 0
df = df.drop('칼럼명', axis = 0)
CSV 저장하기
- csv파일로 저장
데이터프레임명.to_csv('파일명.csv', index=False)
- csv파일 불러오기
df = pd.read_csv('파일명.csv')
인덱싱 / 슬라이싱 / 데이터, 값 추가 / 소팅 / 인덱스 새로 만들기
loc : 인덱스명, 칼럼명
- 특정 행 전체 조회
df.loc[인덱스명]
- 특정 칼럼 전체 조회
df.loc[:, '칼럼명']
- index명이 1인 카페라떼의 가격 칼럼 값 조회
df.loc[1, '가격']
- index명이 2인 카페모카의 메뉴부터 가격칼럼까지 값 조회
df.loc[2, '메뉴' : '가격']
- index명이 2인 카페모카의 메뉴칼럼과 칼로리칼럼 값 조회
df.loc[2, ['메뉴', '칼로리']]
iloc : 인덱스 번호, 칼럼 번호
- 특정 행 전체 조회
df.iloc[인덱스 번호]
- 특정 칼럼 전체 조회
df.iloc[:, 칼럼 번호]
- index가 0인 카페모카의 메뉴(인덱스0)부터 가격(인덱스1)조회
df.iloc[0, 0:2]
- index가 0인 카페모카부터 인덱스가 2인 카페라떼까지 전체 데이터 조회
df.iloc[0:3, :]
df.iloc[0:3]
응용(값/데이터 추가)
- index번호가 0인 아메리카노의 원두 칼럼 값에 콜롬비아 값 추가
df.loc[0, '원두'] = '콜롬비아'
- 리스트 형태로 데이터 추가
- 인덱스가 시즌인 데이터를 추가해보자
df.loc['시즌'] = ['크리스마스 라떼', 6000, 0, 500, '한국']
- 딕셔너리 형태로 데이터 추가
- 인덱스가 10인 데이터를 추가해보자
df.loc[10] = { '메뉴' : '페퍼민트 차', '가격' : 4500, '할인율' : 0, }
- 따로 적어주지 않은 칼럼 값은 결측값 NaN으로 채워짐
소팅
- 인덱스 기준 오름차순 정렬 : sort_index()
df.sort_index(ascending = True)
- 특정 칼럼 기준 오름차순 정렬 : sort_values
df.sort_values('칼럼명', ascending = True)
- 여러 칼럼 기준 정렬
df.sort_values(['칼럼명1', '칼럼명2'], ascending = [False, True])
인덱스 새로 만들기
- 만약 기존 인덱스를 삭제하고 새로운 정수 인덱스를 만든다면 drop = True
df.reset_index(drop = True)
조건필터
조건 1개
- 할인율 0.2보다 큰 데이터만 조회
cond = df['할인율'] > 0.2
df[cond]
조건 여러개
- AND (&)
- 할인율이 0.2이상이고, 칼로리가 200미만
cond1 = df['할인율'] >= 0.2 cond2 = df['칼로리'] < 200 df[cond1 & cond2]
- OR (|)
- 할인율이 0.2이상 또는 칼로리가 200미만
cond1 = df['할인율'] >= 0.2 cond2 = df['칼로리'] < 200 df[cond1 | cond2]
결측치
칼럼별 결측치 확인
df.isnull().sum()
결측값 채우기
- 특정 칼럼의 결측치 채우기
df['칼럼명'].fillna(채우려는 값)
- 모든 결측치 채우기
- 단 주의할 점은 칼럼마다 타입이 다를 경우 구분해서 채울 것
df.fillna(채우려는 값 )
결측치 있는 행 제거
df.dropna(axis = 0)
특정 칼럼의 결측치가 있는 행 삭제
df.dropna(subset=['칼럼'])
결측치를 뒤/앞의 값으로 대체하기 : method=bfill/ffill
df.fillna(method = 'bfill')
df.fillna(method = 'ffill')
값 변경
변경 방법 1 → replace
- 변수에 넣어줘야 원본 데이터 프레임에 반영
df = df.replace(변경전 값1, 변경후 값1).replace(변경전 값2, 변경후 값2)
변경 방법 2 → 딕셔너리 + replace
- 변수에 넣어줘야 원본 데이터 프레임에 반영
change = {
변경전 값 : 변경후 값,
변경전 값 : 변경후 값,
}
df = df.replace(change)
변경 방법 3 → loc
- 특정 데이터의 특정 칼럼 값 변경
df.loc[변경할 칼럼 인덱스 이름, '변경하려는 칼럼명'] = 변경후 값
- 모든 데이터의 특정 칼럼 값 변경
df.loc[:, '원두'] = '코스타리'
내장함수
count(axis = 0또는 1) : 각 칼럼마다 결측값 제외한 요소 개수
- axis = 0 → 각 칼럼마다 결측값 제외한 요소 개수(행 개수)
df.count(axis = 0)
- axis = 1 → 각 행마다 결측값 제외한 요소 개수(열 개수)
df.count(axis = 1)
len() : 데이터 수 조회 cf) shape[0]
len(df)
max() : 최대값
df['가격'].max()
min() : 최소값
df['가격'].min()
mean() : 평균
df['기격'].mean()
median() : 중앙값
df['기격'].median()
sum() : 합계
df['기격'].sum()
std() : 표준편차
df['기격'].std()
var() : 분산
df['기격'].var()
skew() : 왜도
df['기격'].skew()
kurt() : 첨도
df['기격'].kurt()
describe() : 백분위수
df['기격'].describe()
quantile() : 상위 ~%값
- 하위 25% 값
df['기격'].quantile(.25)
- 상위 25% 값
df['기격'].quantile(.75
- 하위 25% 데이터
cond = df['가격'] < df['기격'].quantile(.25) df[cond]
mode() : 최빈값
df['원두'].mode()[0]
apply 함수
- 칼로리가 300이상이면 NO, 미만이면 YES를 반환하는 함수 생성 → 먹어도될까요 칼럼 추가
def cal(x):
if x >= 300:
return 'NO'
else:
return "YES"
df['먹어도될까요'] = df['칼로리'].apply(cal)
그룹핑
- groupby(’칼럼명’)
- 원두 칼럼 기준 평균
- 코랩에서 판다스 버전이 업데이트되어 일부 함수에 numeric_only=True 를 설정
- 시험 환경은 불필요
- 코랩에서 판다스 버전이 업데이트되어 일부 함수에 numeric_only=True 를 설정
df.groupby('원두').mean(numeric_only = True)
- 원두와 할인율 칼럼 기준 평균
df.groupby(['원두', '할인율']).mean()
- 원두와 할인율 칼럼 기준 가격의 평균
- 만약 결과값을 데이터 프레임 형태로 나타내려면 pd.DataFrame()으로 감싸기
df.groupby(['원두', '할인율'])['가격'].mean()
- 그룹화한 것을 인덱스 1개 형태로 리셋
df.groupby('가격').mean().reset_index(drop=True)
시계열 데이터(Datetime cf) to_datetime)
DateTime 형식으로 변환하기
- pd.to_datetime(df[’변환할 칼럼 명’], format = “원래 데이터 형식”)
#'17-Feb-2024' 형태의 데이터를 datetime으로 변환하기
df['Date'] = df.to_datetime(df['Date'], format = "%d-%b-%Y")
알아두면 좋을 형식 지정자
- %Y : 4자리 연도
- %y : 2자리 연도
- %m : 2자리 월
- %B : 전체 월 이름 ex) January
- %b : 약어 월 이름 ex) Jan
- %d : 2자리 일
- %H : 24시간 형식에서 2자리 시간
- %I : 12시가 형식에서 2자리 시간
- %M : 2자리 분
- %S : 두자리 초
- %p : AM 또는 PM
년, 월, 일, 시간, 분, 초 추출하기
- 추출한 값들을 새로운 칼럼에 담아보자
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day
df['hour'] = df['Date'].dt.hour
df['minute'] = df['Date'].dt.minute
df['second'] = df['Date'].dt.second
요일 조회
- dayofweek
- 결과값 0~6, 순서대로 월~일
- 주말이면 True인 칼럼 생성
df['is주말'] = df['Date'].dt.dayofweek >= 5
[참고] 기간
- to_period() : 시간 간격을 주기로 변환 ex) 월별 매출 조회시 유용
df['Date'].dt.to_period('Y')
df['Date'].dt.to_period('Q') #분기
df['Date'].dt.to_period('M')
df['Date'].dt.to_period('W') #주
df['Date'].dt.to_period('D')
df['Date'].dt.to_period('H')
df['Date'].dt.to_period('T') #분
df['Date'].dt.to_period('S')
시계열 데이터(Timedelta)
100일째 되는 날 조회
day = pd.Timedelta(days = 99)
df['100일째'] = df['Date'] + day
3주, 3일, 3시간, 3분, 3초 이전과 이후
diff = pd.Timedelta(weeks = 3, days = 3, hours = 3, minutes = 3, seconds = 3)
df['-diff'] = df['Date'] - diff
df['+diff'] = df['Date'] + diff
기간을 초로 변환 : total_seconds()
df['Date'].dt.total_seconds()
- 그냥 dt.seconds는 전체 초를 셀 수 없음!
문자열
데이터의 일부분 변경시 : str.replace()
df['메뉴'] = df['메뉴'].str.replace('스무디', '에이드')
어절 나누기 : str.split()
df['메뉴'].str.split()
- 어절 나눈 후 첫 번째값 조회시
df['new'] = df['메뉴'].str.split().str[0]
특정 문자 찾기 : str.contains()
df['메뉴'].str.contains('딸기')
특정 값/단어가 있는 지 확인 : isin()
- 특정 값 유무 조회
menu = pd.Series(['딸기 스무디', '사과', '바나나'])
menu.isin(['딸기 스무디', '바나나'])
- 특정 단어 유무 조회
menu = pd.Series(['딸기 스무디', '사과', '바나나'])
menu.str.contains('딸기')
문자 길이 : len()
df['메뉴'].str.len()
대문자 / 소문자 변경 : upper(), lower()
df['메뉴'].str.upper()
df['메뉴'].str.lower()
데이터의 일부분만 슬라이싱 해서 조회
- 년도만 조회
df['날짜'].str[:4]
sum vs len
- len() : 객체의 길이나 크기 반환
- sum() : 숫자로 구성된 iterable의 합계 계산
- 만약 조건에 맞는 데이터 수를 조회하고 싶다면(True, false), sum을 사용하는게 용이
- 나이가 25세보다 큰 데이터 조회
cond = df['나이'] > 25
sum(cond)
len(df[cond])