# 기본적인 방식
df = pd.read_csv('파일명.csv')
# 인코딩 해서 가져오기
# encoding : ['cp949', 'utf-8', 'euc-kr'
df = pd.read_csv('파일명.csv', encoding='cp949')
# 인덱스를 제외해서 데이터를 불러오기
df = pd.read_csv("파일명.csv", index_col=0)
# df의 데이터를 csv 파일로 저장할 때 사용한다.
df.to_csv('파일명.csv')
# df의 데이터를 위치를 지정해서 폴더에 저장할 수 있다.
df.to_excel('폴더명/파일명.csv')
# 이렇게 해서 인덱스를 추가 하지 않고 데이터를 저장할 수 있다.
# 기본값 index = true
df.to_csv('tips_data.csv', index=False)
# 앞 5행 확인
df.head()
# 앞 n행 확인
df.head(n)
# 뒤 5행 확인
df.tail()
# 뒤 n행 확인
df.tail(n)
# 행 수, 컬럼 수
df.shape()
# 행 수
len(df)
# 컬럼명 확인
df.columns
# 인덱스 정보
df.index
# 내용확인
df.values
# 컬럼명, 데이터 결측, 타입, 수 확인
df.info()
# 데이터 요약, 집계
df.describe()
# 데이터 타입 확인
df.dtypes
# 원하는 컬럼의 데이터 타입 확인
df['컬럼명].dtype
# 컬럼별 결측치 수 확인
df.isna().sum()
df.isnull().sum()
# 특정 행 선택
# n행 부터 m-1 행까지 선택
df[n:m]
# 특정 열 선택
df.컬럼명
df['컬럼명']
# 컬럼 복수 선택
df[[컬럼명1, 컬럼명2]]
# 특정 행, 열의 데이터 선택하기
# iloc, loc
iloc[행,열]
loc[행,열]
# iloc : 인덱스 번호, 열 번호로 정보를 가져옴
# loc : 인덱스 이름, 열 이름으로 정보를 가져옴
# 행
df.iloc[1:4] # 1행부터 3행까지
df.loc[1:4] # 1행부터 3행까지
df.iloc[[2]] # 2행 가져오기
df.loc[[5]] # 5행 가져오기
df.iloc[[1,3,5]] # 1,3,5 행 가져오기
df.loc[[2,4,6]] # 2,4,6 행 가져오기
# 열
df.iloc[:,2] # 2번째 열 가져오기
df.loc[:,'컬럼명2'] # 2번째 열 가져오기
df.iloc[:,2:5] # 2번째 열 부터 4번째 열까지
df.loc[:,'컬럼명2':'컬럼명5'] # 2번째 열부터 5번째 열까지
# 행+열
df.iloc[1:6,2:6] # 1행부터 5행까지, 2열에서 5열까지
df.loc[1:6,'컬럼명2':'컬럼명5'] # 1행부터 5행까지, 2열에서 5열까지
# 데이터 변경
df.iloc[1,1] = 100 # 1행 1열의 값을 100으로 바꾸기
df['컬럼명'] = df['컬럼명'] - 5 # 컬럼 1의 모든 값을 -5 해주기
# 데이터 추가
# row 추가
# append 사용
# 시리즈로 추가
df.append(pd.Series({'컬럼명1':'값1', '컬럼명2':'값2'}), name='인덱스이름')
# 딕셔너리로 추가
df.append({'컬럼명1':'값1', '컬럼명2','값2'}, ignore_index=True)
# 딕셔너리로 데이터를 추가하면 인덱스 명을 추가 할수 없어서 인덱스명들이 초기화가 필요
# 주의점: ignore_index=True가 아니면 인덱스 명이 딕셔너리는 지정이 안되기 떄문에 필수
# ignore_index=True : 다른 이름을 지정해 놓은게 초기화가 된다.
# columns 추가
df['컬럼명'] = [100,90,80,40]
# 단 이 방법은 배열의 길이가 데이터 프렝임 행 수와 동일해야한다.
df['컬럼명'] = 1
# 이 컬럼을 추가하고 모든 값을 1로 채우기
# 데이터 제거
# df.drop(index=인덱스명)
# df.drop(columns=컬럼명)
df.drop(100) # 100번째 행 제거 (index= 생락가능)
df.drop(columns='컬럼명') # 특정 컬럼 제거
# 단일조건
# df[조건식]
# 시험 점수를 예시
df[df['점수'] >= 90] # 시험 점수가 90점 이상인 값만 가져오기
# 조건이 2개 이상인 경우
# and : & , or : |
# df[(조건식1) & (조건식2)] and 조건
# df[(조건식1) | (조건식2)] or 조건
# 국어 점수가 90점 이상 이고 수학점수가 70점 이상인 데이터만 가져오기
df[(df['국어'] >= 90) & (df['수학'] >= 70)]
# 국어 점수가 90점 이상 이거나 수학점수가 70점 이상인 데이터만 가져오기
df[(df['국어'] >= 90) | (df['수학'] >= 70)]
# 하나의 컬럼에 여러개의 조건에 따라 다른 값을 반환해야하는 경우
import numpy as np
조건 = [(df['국어'] >= 90),
df['국어'] >= 80) & (df['국어'] < 90),
df['국어'] >= 70) & (df['국어'] < 80)]
분류 = ['A', 'B', 'C']
df['등급'] = np.select(조건, 분류, default='F')
# SQL의 CASE WHEN 구문 비슷하게 활용할수 있다.
# 결측치 확인
# 결측값 탐색
df.isna()
df.isnull()
# 결측값이 아닌 값 탐색
df.notna()
df.notnull()
# 결측값이 몇 개인지 보기
df.isna().sum() # 컬럼별 결측치 개수
df.isna().sum(1) # 행별 결측치 개수
# 결측치 제거
# df.dropna(axis=[0,1], how=['any','all'], thresh=숫자, subset=컬럼명, inplace=[True, False])
# axis : 0=행, 1=열
# how : 'any'= 하나라도 결측이면 제거 'all': 모두 결측이면 제거
# thresh : 결측치가 아닌 값의 최소치 결측치가 아닌 컬럼이 지정 수 보다 적으면 제거
# subset : 어떤 레이블에 결측값이 존재하면 삭제할지 정의
# inplace : True로 하면 변수에 바로 저장
df.dropna() # 결측값이 포함된 모든 행을 삭제
df.dropna(thresh=4) # 결측 값이 아닌 값이 4보다 많은 행만 남기기
# 결측값 대체
df.fillna(value=대채할 값, method=['ffill', 'dfill'], axis=[0,1], limit=숫자)
# value : 대채할 값
# method :'ffill' : 앞의 값으로 대체 'dfill': 뒤의 값으로 대체
# axis : 0=행, 1=열
# limit : method를 지정한 경우 limit으로 지정한 값 만큼 대체 가능
df.fillna(df,mean()) # 평균 값으로 대체
df.fillna(0) # 0으로 대체
df.fillna(method='ffill') #앞의 값으로 대체
# 인덱스를 기준으로 정렬
df.sort_index(axis=0, asecending=[True,False], inplace=False)
# axis : 0=행, 1=열
# asecending : True:오름차순 False:내림차순
# inplace : True로 하면 변수에 바로 저장
# 값을 기준으로 정렬
df.sort_value(by, axis=0, asecending=[True,False], inplace=False)
# by : 정렬 기준으로 사용할 컬럼의 이름 혹은 컬럼명의 리스트
# axis : 0=행, 1=열
# asecending : True:오름차순 False:내림차순
# inplace : True로 하면 변수에 바로 저장
# 1) concat
# pd.concat(onjs, axis=0, ignore_index=[True,False])
# objs : concat을 실행할 객체의 리스트
# axis : 0 = 세로 1 = 가로
# ignore_index : 이거 True 해줘야 인덱스가 예뻐짐
# 2) join
# DataFrame.join(other, on='key컬럼', how='left', lsuffix='왼쪽 접미사', sort=[True, False])
# DataFrame : 결합의 기준이 되는 데이터 프레임
# other : 결합의 대상이 되는 데이터 프레임
# on : key 컬럼의 이름 (단, 두 데이터프레임에서 key 컬럼의 이름이 같아야 함)
# how : {'left','right','inner','outer'} 조인 수행방식 선택
# lsuffix : 왼쪽 컬럼명 접미사
# rsuffix : 오른쪽 컬럼명 접미사
# sort : 키 값을 기준으로 정렬할지 여부
# 3) merge
# DataFrame.merge(right, how='inner', on='key컬럼', left_on='key컬럼', right_on='key컬럼',sort=[True, False]))
# DataFrame : 결합의 기준이 되는 데이터 프레임
# right : 결합의 대상이 되는 데이터 프레임
# how : {'left','right','inner','outer', 'cross'} 조인 수행방식 선택
# on : key 컬럼의 이름 (단, 두 데이터프레임에서 key 컬럼의 이름이 같아야 함)
# left_on/right_on : 두 테이블의 key 컬럼의 이름이 다른 경우 'on'을 대신 하여 각각 지정
# sort : 키 값을 기준으로 정렬할지 여부
df.groupby(by='기준 컬럼', axis=0, as_index=True, sort=False).fun()
# by : 그룹을 결정하는데 사용
# axis : 0 = 행 1 = 열
# as_index : 그룹레이블이 인덱스로 출력될지 여부
# sort: 집계행으로 정렬할지 예측
# 집계 함수정리
# count()
# sum()
# max()
# min()
# mean()
# median()
# std()
# var()
# quantile(n)
# first()
# last()
# describe()
# 집계함수를 복수 사용할 때 사용
# agg
# 1) 피벗테이블
# pd.pivot_table(데이터프레임명, index=컬럼명, columns=컬럼명, values=컬럼명, aggfunc=연산방식)
# index: 인덱스(축) 으로 사용될 열
# columns: 열로 사용될 열
# values: 값으로 사용될 열
# aggfunc: 연산 방식
# 2) melt
# 데이터프레임의 컬럼을 열로 바꿔줌
# 데이터프레임명.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
# id_vars : 기준이 될 열( 그대로 유지할 열 )
# value_vars : 기준열에 대한 하위 카테고리를 나열할 열을 선택( 병합할 열 )
# var_name : 카테고리들이 나열된 열의 이름 설정( 병합 후 표현할 열 이름 )
# value_name : 카테고리들의 값이 나열될 열의 이름 설정( 기본값: value )
# col_level : multi index의 경우 melt를 수행할 레벨을 설정
# ignore_index : 인덱스를 1,2,3, ... , n으로 설정할지 여부입니다. 디폴트값은 True로 1,2,3, ... , n으로 설정됨
# 3) stack
# 컬럼을 인덱스의 하위 레벨로 변환
# 데이터프레임명.stack(level=-1, dropna=True)
# level: stack을 수행할 인덱스 레벨을 지정
# dropna: 스택을 수행한 결과에서 결측값을 제거할지 여부를 지정. 기본값은 True로, 결측값을 제거함
# 4) unstack
# 데이터프레임명.unstack(level=-1, fill_value=None)
# level: unstack을 수행할 인덱스 레벨을 지정.
# fill_value: unstack을 수행한 결과에서 결측값을 채울 값을 지정. 기본값은 None으로, 결측값을 그대로 둠