Zero 부터 시작하는 판다스

이현준·2025년 12월 16일

정리노트

목록 보기
1/4
post-thumbnail

❇️ import pandas as pd


#️⃣ 파일 불러오기 / 저장


read_csv

# 기본적인 방식
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)

to_csv


# 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으로, 결측값을 그대로 둠
profile
Re: 제로부터 시작하는 데이터분석

0개의 댓글