파이썬 판다스 라이브러리

이주현·2023년 12월 3일

파이썬

목록 보기
7/8

판다스 라이브러리

  • 판다스(pandas) 라이브러리는 파이썬에서 데이터분석을 할때 가장 많이 쓰는 라이브러리
  • 표 형태의 데이터를 다루는 다양한 기능을 제공하고 있다
  • 엑셀, csv 등 다양한 데이터 형식을 지원
  • 결측치 처리 가능
  • 데이터 형태 바꾸기
  • 데이터 삭제 및 추가
  • 그룹화, 정렬, 결합
  • 시계열 데이터
  • 문자열 및 날짜/시간 지원

CSV

  • 데이터 형태 CSV는 데이터를 콤마(,)로 구분한다.
  • 판다스의 read_csv() 함수를 사용한다.

TSV

  • 데이터 형태의 TSV는 데이터를 탭(TAB)으로 구분한다.
  • 판다스에서 TSV파일을 읽어오는 함수는 따로 제공하지 않는다.
  • 판다스의 read_csv()함수를 사용하여 TSV 파일을 읽어올 수 있다.

read_csv() = 데이터 불러오기(엑셀이랑 연동가능)

import pandas as pd

pd.read_csv("파일이름.csv")
pd.read_csv("파일이름.csv", sep=',')  # csv같은경우 sep=','는 생략가능
pd.read_csv("파일이름.tsv", sep='\t') # tsv같은경우 sep을 '\t'을 사용하여 tap으로 바꿔준다

엑셀 파일 불러오기

pd.read_csv('파일이름.xlsx',sheet_name = "시트이름")
# sheet 이름이 다른경우 다른 sheet번호에 데이터가 있는경우

Pickle 파일 불러오기

  • 장점 : 속도가 빠르다, 낮은 용량, 많은 데이터 가능
  • 단점 : 데이터를 볼 수 없다. (저장용이라면 pickle 사용하기)

csv, tsv, excel = 눈으로 보고 싶을 때 사용한다.
read_csv,read_excel
but 속도가 느리고 용량이 큰 단점이 있다.

pd.read_csv('파일이름.pickle')

CSV 파일로 저장하기

df.to_csv('파일이름.csv',index = True)

매개변수
index = True/False : 인덱스 유무(행 번호 보이게/안보이게)

TSV 파일로 저장하기

df.to_csv('파일이름.tsv, sep ='\t', index = True)

매개변수
index = True/False : 인덱스 유무(행 번호 보이게/안보이게)

엑셀 파일로 저장하기

df.to_excel('파일이름.xlsx', index = True)

매개변수
index = True/False : 인덱스 유무(행 번호 보이게/안보이게)

Pickle 파일로 저장하기

df.to_pickle('파일이름.pickle')

한글처리 인코딩

  • utf-8 (유니코드)
  • cp949
  • euc-kr



시리즈

데이터프레임에서 각각의 열을 시리즈 라고 한다.
판다스의 pd.Series() 함수를 사용하여 시리즈를 생성할 수 있다.

  • 표(데이터프레임) 형태의 데이터
  • 열 = 시리즈

딕셔너리를 사용하여 시리즈 만들기

dic = {"a" : 1, "b" : 2, "c" :3}
pd.Series(dic)

=> 행   값
   a    1
   b    2
   c    3
dtype: int64

리스트를 사용해서 시리즈 만들기

box = ['홍길동', '이순신', '아이유']
pd.Series(box)

=> 
0    홍길동
1    이순신
2    아이유
dtype: object
box = ['홍길동', '이순신', '아이유']
pd.Series(box, index = ['가','나','다'])

=>
가    홍길동
나    이순신
다    아이유
dtype: object

시리즈 자료형 확인

box = ['홍길동', '이순신', '아이유']
s = pd.Series(box, index=['가','나','다'])
type(s)

=> pandas.core.series.Series

s.index = 시리즈 행이름 확인

s.values = 시리즈 값 확인

딕셔너리로 데이터프레임 만들기 (갯수가 같아야한다)

dic = {'이름': ['홍길동','이순신','아이유'],
        '성별':['남자','남자','여자'],
        '나이': [40,50,20]}
pd.DataFrame(dic)

=>
     이름	성별	나이
0	홍길동	남자	 40
1	이순신	남자	 50
2	아이유	여자	 20

데이터프레임 행이름 설정

dic = {'이름': ['홍길동','이순신','아이유'],
        '성별':['남자','남자','여자'],
        '나이': [40,50,20]}
pd.DataFrame(dic, index = ['A','B','C']) #행이름 설정

=>
     이름	성별	나이
A	홍길동	남자  40
B	이순신	남자	 50
C	아이유	여자	 20

데이터프레임 열이름 설정

dic = {'이름': ['홍길동','이순신','아이유'],
        '성별':['남자','남자','여자'],
        '나이': [40,50,20]}
pd.DataFrame(dic, index = ['A','B','C'], columns = ['성별','나이','이름'])

=>
	성별	나이	이름
A	남자	 40	홍길동
B	남자	 50	이순신
C	여자	 20	아이유

리스트로 데이터프레임 만들기 (제일 많이 사용!)

box = [['홍길동','남자','40'],['이순신','남자','50'],['아이유','여자','20']]
pd.DataFrame(box)

=>
      0	     1	 2
0	홍길동	남자	 40
1	이순신	남자	 50
2	아이유	여자	 20
box = [['홍길동','남자','40'],['이순신','남자','50'],['아이유','여자','20']]
pd.DataFrame(box, columns= ['이름','성별','나이'])

=>
     이름	성별	나이
0	홍길동	남자	40
1	이순신	남자	50
2	아이유	여자	20

df.columns = 데이터 프레임 열 이름 확인

df.index = 데이터프레임 행 이름 확인

groupby = 함수 제일 많이 사용함

  • 판다스에서 제공하는 데이터프레임을 집단별로 나누어 주는 함수
  • 각 집단별로 통계값을 구할 때 유용하게 사용 가능
  • groupby, melt, to_datetime = 판다스 쓰는 이유

groupby 함수 소개


많이 사용

  • count = 누락값을 제외한 데이터 수
  • mean = 평균
  • std = 표준편차
  • min = 최소값
  • max = 최대값
  • sum = 전체 합
  • describe = 요약 통계량

  • size = 누락값을 포함한 데이터 수
  • var = 분산
  • frist = 첫번째 행
  • last = 마지막 행

데이터프레임에서 열에 접근하기

df[]
df[[1,2]]  #대괄호 2개

데이터프레임에서 행, 열에 접근하기

  • loc = 이름으로 접근
  • iloc = 순서로 접근
lic[0] => 행이름이 0
iloc[0] => 0번째 행

loc[[0,10,100], ["year", "역"]]
iloc[[0,10,100], [0,2]]

데이터프레임에서 내가 원하는 행만 추출하기

df[조건]
df[(조건)] & (조건2)]
df[(조건)] | (조건2)]

df[df['직업'] == '연구원']
df[(df['직업'] =='연구원') | (df['나이']>df['나이'],mean())]

df.head() =데이터프레임의 머리 부분 추출

df.head()
df.head(n=10)

df.tail() =데이터프레임의 꼬리 부분 추출

df.tail()
df.tail(n=10)

df.shape = 데이터프레임 모양 확인(몇행 몇열)

df.columns = 열 이름 확인

df.dtype = 열 자료형 확인(중요)

df.info() = 정보확인 (dtype보다 더 자세히)

drop_duplicates =시리즈 중복데이터 삭제하기

s.drop_duplicates()
df.drop_duplicates()

s.replace = 특정 값 바꾸기

s.replace(, 변경값)

s.sample = 시리즈 랜덤 샘플 추출

s.sample(n)

정렬하기

s.sort_values() = 오름차순
s.sort_vlaues(ascending = False) = 내림차순

s.sort_index() = 행번호
s.sort_index(ascending = False) = 내림차순

s.to_frame() = 시리즈 프레임화

pd.to_datetime() = 시간데이터 변환(중요!)

  • 문자열로 된 날짜 데이터를 시간 데이터로 변환
    df['출생일'].dt.day(month)


판다스로 그래프 그리기

데이터 시각화 하기

히스토그램

fig = plt.figure()  = 그림 그리기위한 도화지 준비
ax = fig.add_subplot(1,1,1) = 원하는 행 열 번째 정하기. (111번째)
ax = df[].plot.hist() = 히스토그램 만들기

ax1.set_title(제목) = 큰제목
fig_suptitle(제목) = 그림중1개 제목
fig.tight_layout() = 윗 그래프와 제목이 겹쳤을때 사용

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax = tips['total_bill'].plot.hist()

투명도와 막대갯수 설정하기

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax = tips[['total_bill', 'tip']].plot.hist(alpha=0.5, bins= 20)

alpha = 투명도
bins = 막대 갯수

밀도 함수 그래프

ax = tips['tip'].plot.kde()  #자리할당 안해도됨(plt.figure())
kde() = 밀도

산점도 그래프

df.plot.scatter(x='total_bill',y='tips')

육각형 모양 삼전도

df.plot.hexbin(x='total_bill',y='tips', gridsize = 10)
# gridsize = 육각형 크기

원형 그림

df.plot.pie(y='mass')

여러 개의 데이터프레임을 하나로 합치는 방법

concat = 여러 개의 데이터프레임을 합치는 함수

  • axis = 1 = 열방향
  • axis = 0 = 행방향
pd.concat([df1,df2,]) = 열 이름을 기준으로 합침

pd.concat([df1,df2,], axis = 1) = 행 이름을 기준으로 합침

df.index[ ] = 행 이름 바꾸기

df.columns[ ] = 열 이름 바꾸기

merge = 특정 열을 기준으로 데이터 프레임을 합치는 방법

df1.merge(df2, left_on =df1의기준열, right_on=df2의 기준열)

ex)
visited.merge(site, left_on = "site", right_onf = "name"_

누락값 처리하는 방법

  • 누락값 이란 비어있는 값을 말함
  • 누락값이 하나라도 있다면 데이터분석 및 연산이 원할하지 못할 수 있음

pd.isnull() = 누락값인지 아닌지 판단 가능

  • 누락값이면 True, 아니면 False

pd.notnull() = 누락값 판단

  • 누락값이 아니면 True 아니면 False

누락값 개수 구하기

  • 데이터 개수 - df.count( )
np.count_nonzero(데이터.isnull())
df['Cases_Guinea'].calue_counts(dropna=False)
  • 누락값 채우기 = fillna(값) (중요!!)

fillna(method = 'ffill') = 바로 앞,뒤 값으로 채움
fillna(method = 'bfill')
df.interpolate() = 흐름에 따라 채움(아주 강력)

열에 있는 값을 행으로 내리는 방법

melt

  • 지정한 열의 데이터를 모두 행으로 내려주는 기능
  • id_var = 고정할 열
  • var_name = 위치를 변경한 열의 이름
  • value_name = 위치를 변경한 열의 데이터를 저장한 열의 이름
pd.melt(df, id_var = ~)

pd.melt(df, id_vars=['religion'], var_name = 'income', value_name = 'count')

pd.melt(billboard, id_vars=['year','artist','track','time','date_entered'],
var_name='week',value_name = 'rating')

열 분할하기

  • 분할 = 시리즈.str.split(기준)
  • 수집 = 시리즈.str[인덱스]
s.str.split('학번')

행에 있는 값을 열로 올리는 방법

pivot_table

  • melt와는 반대로 행에 있는 값을 열로 올려서 새로운 열을 만드는 기능
  • 매개변수
    • index = 고정하고 싶은열,
    • columns = 열로 올리고 싶은 열,
    • values = 새로 올라간 열이 가지게 될 값,
    • dropna = True/False (NaN값 포함, 불포함)
pivort_table(index = ['id','year','month','day'], columns = 'element, calues = 'temp',
dropna = False)

인덱스 새롭게 다시 만들기

df.reset_index()

데이터에 순위 매기기

rank

  • 특정 열의 값에 따라 순위를 매겨주는 함수
  • Method
    • average = 동점 관측치 간의 그룹 내 평균 순위 부여
      • 3등 2명 => 3.5등 -> 5등
    • min = 동점 관측치 그룹 내 최소 순위 부여
      • 3등 2명 => 2명다 3등 -> 5등
    • max = 동점 관측치 그룹내 최대 순위 부여
      • 3등 2명 => 4등 -> 5등 (3등x)
    • first = 동점 관측치 중 데이터 상에서 먼저 나타나는 관측치부터 순위부여
      • 3등 2명 => 먼버 발견한 3등, 다음 4등 -> 5등
    • dense = 최소값과 같으나 그룹간 순위가 1씩 증가
      • 3등 2명 => 둘다 3등 후 4등 (min과 같음)
  • ascending = True / False (오름차순, 내림차순)
pd[].rank(method = ~, ascending=True/False) (오름차순,내림차순)

df.groupby('반').mean() = 반평균
df['총합'] =df['국어'] + df['영어'] 등
df['총합'] = df.iloc[:,2:],sum(axis =1)
df['평균'] = df['총합']/5
df['순위'] = df['평균'], rank(method = 'average', ascending = False)
profile
Backend Delveloper

0개의 댓글