본문 바로가기
[ Python ]

[Python] Pandas 기초/ Series /DataFrame / 실습(1)

by 히앤님 2020. 10. 28.
반응형
SMALL

Pandas 

온전히 통계 분석을 위해 고안된 R 과는 다르게 python은 일반적인 프로그래밍 언어(general purpose programming language) 이며, 데이터 분석을 하기 위해서는 여러가지 라이브러리를 사용할 수 밖에 없다. 이 패키지들 중 R의 dataframe 데이터 타입을 참고하여 만든 것이 바로 pandas dataframe이다. pandas는 dataframe을 주로 다루기 위한 라이브러리이며, dataframe을 자유롭게 가공하는 것은 데이터 과학자들에게 중요하다.(출처) 

모양은 엑셀 시트를 하나의 데이터 타입으로 만들어 놓은 듯 하다. 행과 열로 이루어져 있어, 테이블의 형식으로 볼 수 있다. 

DataFrame 

Series들의 집합. 
여러개의 Series(행)이 모여 하나의 테이블형식의 데이터를 생성할 수 있다. 
행과 열이 있는 table 형태를 가진다. 


Series 

DataFrame의 한 컬럼 데이터세트. 
Series 역시 DataFrame의 인덱스와 동일한 인덱스를 가진다.  
Series는 테이블 형식의 데이터로 봤을때 하나의 레코드 즉, 행 값으로 생각하면 된다. 

=> 즉, Series는 컬럼이 하나인 데이터 구조체이고, DataFrame은 컬럼이 여러개인 데이터 구조체이다.


자료구조

리스트 튜플 딕셔너리
a=[1,2,3] a= (1,2,3) a={'kim' : 25, 'park' : 22, 'lee' : 34}
a={ "a" : [5,6,7], "b" : [8,9,10]} 

 

1. 튜플(tuple)

  • 리스트와 비교가 많이되며, 리스트와의 가장 큰 차이점은 요소를 삭제하거나 변경할 수 없다는 것. 이를 immutable(불변성) 이라고 표현함, iterable 함(반복 가능한 객체)
  • 리스트는 append, remove 메소드로 요소들을 추가하거나 삭제할 수 있지만 튜플은 이러한 메소드가 없음
  • 튜플 + 튜플 형식으로 요소를 추가할 수는 있으며, 삭제도 indexing을 통해서 삭제하고자 하는 요소의 index를 선택하지 않으면 가능하다. But, 이와 같은 방식은 억지로(?) append나 remove가 된 것 처럼 한 것이라 할 수 있음
  • 리시트에서는 예를 들어 a라는 리스트가 있을 때, a 자체를 변화를 줄 수 있지만, 튜플은 a라는 튜플 b라는 튜플이 있을때 c = a + b 형식으로 새로운 변수에 할당하는 방식으로 append와 결과적으로만 동일한 튜플을 만들 수 있는 것이다.
  • 또한, 다른 type의 데이터들을 담을 수 있음 ('a', 1, 3) 이런 식으로.

 

2. 리스트(list)

  • 튜플과 비교가 많이되며, 튜플과의 가장 큰 차이점은 요소를 삭제하거나 변경할 수 있다는 것. 이를 mutable(가변성)이라고 표현함, iterable 함(반복 가능한 객체)
  • 리스트는 append, remove 메소드로 요소들을 추가하거나 삭제할 수 있음
  • 튜플과 마찬가지로 리스트 + 리스트 형식으로 요소를 추가할 수 있음
  • 또한, 다른 type의 데이터들을 담을 수 있음 ['a', 1, 3] 이런 식으로.

 

3. 딕셔너리(dict)

  • 딕셔너리를 구현한 클래스는 셋(set)
  • 따라서, 딕셔너리는 셋처럼 중복이 불가능한 collection 자료형이고, mutable(가변성) 하며, key : value 라는 독특하고 유용한 구조로 이루어짐(중복이 불가능하다는 뜻은 key값들 끼리 중복이 불가능 하다는 뜻)
  • a라는 딕셔너리가 있을때 keys나 values 메소드를 활용하여 key나 value값 확인가능. key와 value를 모두 확인하고 싶을 때는 items 메소드를 사용
  • (참고) B = {'a' : [1]}라는 딕셔너리는 value가 list 형태이므로 B['a'].append or B['a'].remove 가 가능

 

4. 셋(set)

  • 셋은 순서가 없는 중복이 불가능한 collection 자료형이다. -> 내장모듈 collections 알아두면 좋음. mutable(가변성) 
  • 요소들 간의 순서가 없음 -> 따라서, indexing이 불가 -> not iterable
  • 중복제거 교집합, 합집합, 차집합 등의 수학적인 계산이 가능
  • 셋은 add(요소 1개 추가), update(여러요소 추가), remove 메소드를 활용하여 요소를 추가/삭제한다.
  • 합집합은 a | b로 표현, 차집합은 a - b로 표현, 교집합은 a & b로 표현

Series

# 자료구조 -> Series 생성 : pd.Series(자료구조)

# list -> Series로 바꾸기

a = pd.Series([22,23,44,55,28])

# dict -> Series로 바꾸기

a = pd.Series({'kim' : 25, 'park' : 22, 'lee' : 34})

# tuple -> Series로 바꾸기

a = pd.Series((10,20,30))


# 배열(Array)과 리스트(List) 차이

Array List
여러 데이터를 하나의 이름으로 그룹핑해서 관리 하기 위한 자료구조 여러 데이터들을 순서대로 빈틈없이 적재하기 위한 자료구조(=시퀀스)
인덱스가 변경되지 않는다(정해져있는 키값) 인덱스는 몇 번째 데이터인지만 나타냄(순서번호)
추가적인 삽입, 삭제가 일어나지 않으므로 검색에 유리 추가적인 삽이브 삭제가 일어남
데이터의 크기가 정해져 있음 데이터의 크기가 정해져 있지 않음

-> 파이썬에서는 list가 배열이다. 배열을 따로 제공하지 않음. 따라서 배열을 따로 사용하려면 numpy로 불러와야 한다.

array : 그룹핑(쉼표없음) list : 시퀀스(쉼표있음)


# 앨리먼트(요소) 출력 : .index / .values

#Series 인덱스(index) 출력(=key)

a.index / a.keys() / a.keys

-> rangeIndex : 기본 인덱스 범위가 안정해졌을때 알아서 지정해준 그 인덱스의 범위를 표시해준다.

#Series 값(value) 출력 : values / a[인덱스번호]

-> array로 출력 / -1의 경우 거꾸로

#Series 자료형(type) 출력 : type()


# Series 인덱스(index) 생성 : pd.Series( 자료구조 데이터 ,index=['가','나','다'])

-> 딕셔너리일 경우, 키값이 시리즈의 인덱스로 설정되어 있기 때문에 시리즈를 생성할 때 새로운 인덱스를 부여하면 그 인덱스에 새로운 키로 생성 ->NaN


# 앨리먼트(요소) 변경

# 인덱스로 값(value) 변경

a['다']=100

# 인덱스(index) 변경

a.index = ['A','B','C']


DataFrame

# 자료구조 -> DataFrame 생성 : pd.DataFrame(자료구조)

자동으로 table 형태로 만들어진다.


# 앨리먼트(요소) 출력

#타입 출력 : df.dtypes

#정보 출력 : df.info()

-> df.info는 모든 테이블 값들이 다 출력된다.

#컬럼별로 값 출력

print(df.컬럼명)

-> 컬럼명을 리스트로 묶어서도 가능 : df[idx_list]


# 컬럼과 인덱스 설정

df = pd.DataFrame(cc, index=[1,2,3], columns=[a,b,c])

# index와 column 

  • index(행) :가로로 한줄한줄 의미
  • column(열):세로로 한줄한줄 의미
  • 각각의 이름을 붙여준다면 index=[세로를 대표] column=[가로를 대표]

# index와 column 값 변경

#새로운 column 추가

-> 딕셔너리를 데이터프레임의 값으로 처리할 때 키값이 다를 경우, 또는 새로운 칼럼을 추가할  경우 그 값은 NaN 으로 처리된다.

# df.컬럼명 = 0.7 처럼 통일해서 채워넣거나, 데이터로 연산 가능.

# 컬럼명으로 값 변경 또는 추가


# 다양한 DataFrame 메소드

# 범위 안 정수 출력 (5부터 14까지) : arrage

# 배열/테이블 모양을 만들기 : reshape

-> reshape()는 다차원으로 변형이 가능

#  Series 출력

키-값 쌍을 한 꺼번에 뽑아 내는 함수. generator 형식으로 뽑힌다. : items()

->generator : 리스트의 단점을 극복해서 리스트와 같은 자연현상을 조금 최소화 할 수 있다. 

 

# 중복데이터 처리 (실제로는 사라지지 않음. 보여지기만 하는것.) : df.drop_duplicates() 

-> df.drop_duplicates(inplace=True) : 바로 중복데이터 처리 적용(또는 초기화 : df = df.drop~~)

 

# 데이터프레임 크기 ex)5x3 형태 등 : df.shape

# 차원출력 ex) 2차원, 3차원 등 : df.ndim 

#컬럼 삭제 : del

 del df['컬럼명'] 

# 데이터 슬라이스

- df.loc[시작순서번호 : 끝순서번호] / [행범위,열범위] : 레이블 기반 인덱싱

- df.iloc[시작순서번호 : 끝순서번호] / [행범위,열범위] : 위치 정수 기반으로 인덱싱


# 비교연산자

-> 행(가로)을 가져온다.

# loc + 비교연산자

loc[시작순서번호 : 끝순서번호] / [행범위,열범위] : 열범위가 전체인 것.

# and / or 연산자 + 비교연산자


[ 나눔고딕 폰트 설치 ]

나눔 폰트 설치
글꼴 캐시 갱신

base에 설치 후 주피터 노트북에 추가 설치 해야한다.

#폰트 확인(주피터에서 확인해야 가져올 수 있음)
!ls -l /usr/share/fonts/truetype/nanum | grep NanumGothic*
#캐시 삭제
!rm. -rf ~/.cashe/matplotlib/*
#가져온 폰트 설치 
!fc-cache -fv
#설치 되어있는지 보기 위해 matplotlib 폰트 매니저로 폰트 있는지 확인
import matplotlib
import matplotlib.font_manager
#나눔 이름 붙은 폰트 있니?
[f.name for f in matplotlib.font_manager.fontManager.ttflist if 'Nanum' in f.name]

폰트를  설치한 후 한글이 깨지지 않는지 확인해준다.

#한글설정 #유니코드깨짐 #폰트설정

import matplotlib as mpl
import matplotlib.pyplot as plt
#유니코드 깨지는 현상 방지
mpl.rcParams['axes.unicode_minus'] = False
#폰트 설정
plt.rcParams['font.family'] = 'NanumGothic'

#테스트
plt.figure()
plt.grid(True)
plt.plot((1,1))
plt.title("한글테스트")
plt.show()

안깨지고 잘 출력된다.

 

반응형
LIST

댓글