728x90
:: Pandas 문법 기초
#기본 활용 문법
- 각 칼럼 내 고유값 수 출력 : nunique( )
- 각 항목별 개수 : value_counts( )
- 자료형 변경 : astype( )
- 특정 행 삭제 : df.drop(1, axis = 0) → 1번 행만 선택해서 삭제
*df = df.drop(~~)과 같이 기존 객체명에 적용해야 삭제 반영됨 - csv로 저장 : to_csv(’파일명’, index=False) → 인덱스값 저장하지 않음
#인덱싱/슬라이싱
- loc vs iloc
- loc : 인덱스 이름 / 마지막 선택자 포함 o
- iloc : 인덱스 번호 / 마지막 선택자 포함 x
index | 메뉴 | 가격 | 칼로리 |
0 | 아메리카노 | 4100 | 10 |
1 | 카페라떼 | 4600 | 180 |
2 | 카페모카 | 4600 | 420 |
3 | 바닐라콜드브루 | 5100 | 320 |
# 인덱싱 예시
df.loc[1:2, '가격':'칼로리']
df.iloc[1:3, 1:]
#데이터 추가
import numpy as np
# 결측치로만 이루어진 ‘원두’ 칼럼 추가
df['원두'] = np.nan
# 리스트 형태로 데이터(행) 추가
df.loc['시즌'] = ['크리스마스라떼', 6000, 500, '한국']
# 딕셔너리 형태로 데이터(행) 추가
df.loc[5] = {'메뉴':'에소프레소', '가격':2000, '칼로리':10}
index | 메뉴 | 가격 | 칼로리 | 원두 |
0 | 아메리카노 | 4100 | 10 | NaN |
1 | 카페라떼 | 4600 | 180 | NaN |
2 | 카페모카 | 4600 | 420 | NaN |
3 | 바닐라콜드브루 | 5100 | 320 | NaN |
시즌 | 크리스마스라떼 | 6000 | 500 | 한국 |
5 | 에스프레소 | 2000 | 10 | NaN |
#정렬 (sorting)
- sort_index(ascending=False)
→ ‘인덱스’ 기준 내림차순 정렬 - sort_values(’칼럼명’, ascending=False)
→ ‘칼럼’ 기준 내림차순 정렬
# 여러 칼럼을 기준으로 할 경우 칼럼명과 옵션 모두 list로 묶어줘야 함
df = df.sort_values(['가격', '메뉴'],ascending=[False, True])
- reset_index(drop=True)
→ 정렬한 기준대로 새로운 인덱스값 생성, 기존 인덱스값은 지움 - set_index(’칼럼명’, inplace=True, drop=True)
→ inplace=True (원본에 바로 반영) / drop=True (해당 칼럼을 데이터프레임에서 삭제)
#조건필터
# 1) 1개 조건
df[df['할인율'] > 0.2]
# 2) 2개 조건
cond1 = df['할인율'] >= 0.2
cond2 = df['칼로리'] < 400
df[cond1 & cond2]
#결측치 & 값 변경
*문제 풀 때는 결측치 제거 전후로 shape를 print하여 데이터 형식 변화 비교해보기
- 칼럼별 결측치 확인 : df.isnull().sum()
- 결측치 채우기 : df[’칼럼명’].fillna(’채울 값’)
- 값 변경 : replace(’기존 값’, ‘변경할 값’)
# 여러 문자 변경 : 아메리카노 -> 룽고, 녹차 -> 그린티
df.replace('아메리카노', '룽고').replace('녹차','그린티')
# 딕셔너리 활용
d = {'아메리카노':'룽고', '녹차':'그린티'}
df = df.replace(d)
- 결측치 제거 : df.dropna()
- 특정 칼럼을 기준으로 할 경우 df.dropna(subset=[’칼럼명’])
- 특정 칼럼을 기준으로 할 경우 df.dropna(subset=[’칼럼명’])
#내장함수
# 왜도
df[’칼럼명’].skew()
# 첨도
df[’칼럼명’].kurt()
# 하위 25% 값
df[’칼럼명’].quantile(.25)
# 상위 25% 값
df[’칼럼명’].quantile(.75)
# 최빈값
df[’칼럼명’].mode()[0]
##[0]이라고 인덱스를 지정해줘야 값만 추출됨
#groupby
# '원두' 칼럼 기준 평균
df.groupby('원두').mean()
# '원두'와 '할인율' 기준, 가격 평균
df.groupby(['원두', '할인율'])['가격'].mean()
# 1개 인덱스 형태로 리셋 -> 이렇게 해야 기존 df의 인덱스 형태를 띔
df.groupby(['원두', '할인율']).mean().reset_index()
:: 시계열 데이터
- object에서 날짜형 데이터로 변환 : pd.to_datetime(df[’칼럼명’])
# 연도가 4자리일 때 : %Y (대문자), 연도가 2자리일 때 : %y (소문자)
df['Date2'] = pd.to_datetime(df['Date2'], format="%Y:%m:%d")
# '%Y년%m월%d일', '%y-%m-%d %H:%M:%S', '%Y-%m-%d %H-%M-%S' 등 다양한 포맷에 맞춰 변환 가능
- 시계열 데이터 칼럼에서 년/월/일/시간/요일 정보 각각 출력 가능
df[’칼럼명’].dt.year (혹은 month, day, hour, minute, second, dayofweek) - 요일 출력 (숫자로 반환) : df[’칼럼명’].dt.dayofweek
- 영문 요일명 출력 : df[’칼럼명’].dt.day_name()
- datetime 간의 연산 결과를 기간(시, 분, 초..)으로 변환 : dt.total_seconds()
timedelta 자료형에만 적용 가능
diff = df['100일'] - df['100시간'] # 94 days 20:00:00
print(diff.dt.total_seconds()) # 초 : 8193600.0
print(diff.dt.total_seconds()/60) # 분
print(diff.dt.total_seconds()/60/60) # 시간
print(diff.dt.total_seconds()/60/60/24) # 일
# 주의
print(diff.dt.seconds) # 72000
# dt.seconds는 '시간'에 대해서만 계산한 것이므로 '일'은 포함하지 않고 20시간을 초로 환산한 값만 반환
# 따라서 'total_seconds'를 사용해야 정확히 계산 가능
:: 문자열 데이터
- 문자열 값 변경 : replace()
- 변경하고자 하는 전체 문자값이 일치해야 정상 변경됨
- 일부 문자만 변경하고자 할 땐 ‘str’이라는 접근자 사용해야 함
- 어절 나누기 : split()
# A 칼럼 띄어쓰기 기준 어절 나누기
df['A'].str.split()
# 어절 나눈 후 첫 번째 값 선택
df['A'].str.split().str[0]
# 접근자를 한번 더 사용해야 첫번째 값들만 출력 가능
# 접근자 사용하지 않을 경우 첫번째 행이 출력됨
# 슬래시'/' 기준 어절 나누기
df['C'].str.split('/')
- 특정 문자 찾기 : df.str.contains(’찾을 문자’)
- df.isin([’문자열1’, ‘문자열2’…])
⇒ isin 함수는 여러 단어를 한번에 찾을 수 있는 장점이 있으나 일부 단어만 찾는 건 불가능
- df.isin([’문자열1’, ‘문자열2’…])
*해당 내용은 인프런 '퇴근후딴짓' 강의 수강 및 개인공부를 통해 개별적으로 정리한 내용입니다.
728x90
'Study' 카테고리의 다른 글
[자격증] 빅데이터분석기사 실기 요약정리(작업형3) (1) | 2024.09.14 |
---|---|
[자격증] 빅데이터분석기사 실기 요약정리(작업형2) (0) | 2024.07.18 |
[자격증] 빅데이터분석기사 8회 실기 합격 후기 | 준비기간, 퇴근후딴짓 강의, 꿀팁 (0) | 2024.07.02 |
[자격증] (✨요약정리 공유) 빅데이터분석기사 8회 필기 합격 후기 | 비전공자 공부방법, 준비기간 (14) | 2024.06.29 |