Chapter 5. Pandas 시작하기 (1)

2022. 3. 1. 21:00개인활동/파이썬 라이브러리를 활용한 데이터 분석

 

Pandas의 특징

  • numpy, scikit-learn, matplotlib 등의 다른 라이브러리와 함께 사용함
  • for문을 사용하지 않고 데이터를 처리함
  • 배열기반의 함수를 제공
  • numpy의 스타일을 많이 차용했으나 표 형식의 데이터나 다양한 형태의 데이터를 다루는데 초점을 맞추어 설계

Pandas import하기

import pandas as pd
  • pandas를 pd로 지칭하여 편하게 불러올 수 있도록 함

Pandas 자료구조

> Series <

  • 1차원 배열의 자료구조
  • index는 배열의 데이터와 연관된 이름을 가짐
obj1 = pd.Series([4, 7, -5, 3])
obj1

  • 좌측의 0, 1, 2, 3은 index, 우측의 데이터 값을 value라고 함
  • index를 따로 지정해주지 않는 경우 0~(n-1)의 값을 가짐
  • Series의 index값과 value값을 얻어낼 수 있는 속성은 각각 index와 values가 있음
obj1.index  # 인덱스를 따로 지정하지 않은 경우: 인덱스의 시작점과 끝점, 그리고 인덱스 사이의 간격을 알 수 있음
obj1.values  # values에서 s를 빼먹지 않도록 조심하자

  • Series의 index값을 지정해준 경우
obj2 = pd.Series([4, 7, -5, 3], index=['a', 'b', 'c', 'd'])
obj2

  • Series의 index값을 지정해준 경우 index 속성을 이용하면?
obj2.index

  • Series의 하나의 값을 선택하거나 여러개의 값을 선택할 때 index를 이용해 출력할 수 있음
obj2['a']

obj2[['a', 'b']]  # index를 여러개 적는 경우, 두겹의 리스트로 작성해 주어야 함. index 또한 배열로 해석되기 때문.

  • 두겹의 리스트로 작성하지 않으면?
obj2['a', 'b']

  • index가 a인 value 값을 출력할 때 obj2[[’a’]]를 이용하면 어떤 결과값이 나올까?
obj2[['a']]

  • Series는 index값에 특정 데이터 값을 가지고 있는 형태 → 이는 딕셔너리 자료형과 유사한 형태라고 볼 수 있음
  • 딕셔너리형 데이터를 Series로 변환하기
sdata = {'Ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}
obj3 = pd.Series(sdata)
obj3

states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states)
obj4

  • sdata의 index와 states index를 비교했을 때 겹치는 부분은 값이 나오지만 California의 경우 값이 존재하지 않아 NaN(Not a Number)으로 나타남
  • obj4의 경우 index는 states로 지정했기 때문에 sdata의 인덱스는 기준이 아님 → Utah는 나타나지 않음
  • NA값을 찾는 방법: isnull() 또는 notnull() 함수를 이용해 NA값을 찾을 수 있음 (bool 값으로 반환)
pd.isnull(obj4) # == obj4.isnull()

pd.notnull(obj4) # == obj4.notnull()

  • isnull(), notnull() 함수는 Series의 메서드로도 존재해 위와같은 코드처럼 사용할 수 있음
  • obj3과 obj4의 산술 연산이 가능할까?
obj3 + obj4

  • Series의 객체와 index는 name 속성을 가지고 있음 → Series 객체 자체에 이름을 붙일 수 있으며, index에도 이름을 붙일 수 있음
obj4.name = 'population'
obj4.index.name = 'state'
obj4

  • 기존의 index에 다른 index 이름을 대입할 수 있음
obj1

obj1.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj1

> Data Frame <

  • DataFrame은 표같은 스프레드시트 형식의 자료구조
  • 여러개의 column이 있을 수 있으며, 서로 다른 data type을 담을 수 있음
  • low, col 각각 index를 가지고 있음
  • DF 객체 생성하기
    • 딕셔너리형 이용하기
    data = {'state' : ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
    				'year' : [2000, 2001,  2002, 2001, 2002, 2003],
    				'pop' : [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
    frame = pd.DataFrame(data)
    frame
    


  • 큰 DataFrame을 다루는 경우 head 메서드를 이용해 처음 5개의 로우만 출력할 수 있음
frame.head()

  • 원하는 순서대로 column을 지정해주면 그 순서대로 DF 객체가 생성됨
pd.DataFrame(data, columns=['year', 'state', 'pop'])

  • 사전에 없는 값을 넘기면 Na값으로 저장
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
                      index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2

  • column은 딕셔너리형 표기법이나 속성 형식으로 접근할 수 있음
frame2['state']

frame2.year

  • 속성 형식으로 접근할 때 column명이 예약어인 경우 속성형식으로 접근 불가
  • low는 위치나 loc 속성을 이용해 index 이름으로 접근할 수 있음
frame2.loc['three']

frame2.loc[2]

  • index의 이름이 2가 아니기 때문에 오류남.
  • 새로운 column 생성하기
frame2['debt'] = 16.5
frame2

  • 리스트나 배열을 column에 대입할 때 대입하려는 값의 길이가 DataFrame의 크기와 동일해야함
frame2['debt'] = np.arange(6.)  # numpy의 arange 함수: 0부터 4.0까지 대입
frame2

  • DataFrame에 Series 데이터를 대입하는 경우 index 값에 따라 대입되며, 존재하지 않는 index의 값은 Na처리됨
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2

  • 존재하지 않는 column을 대입하는 경우 새로운 column을 생성함
  • 딕셔너리처럼 del을 이용해 column 삭제 가능
frame2['eastern'] = frame2.state == 'Ohio'  # state에서 Ohio를 포함하고 있는지를 bool 값으로 반환해주는 col
frame2

del frame2['eastern']

frame2.columns  #frame2를 구성하고 있는 col을 볼 수 있음

  • 중첩된 딕셔너리형 데이터를 이용한 DF 생성
pop = {'Nevada' : {2001:2.4, 2002:2.9},
				'Ohio' : {2000:1.5, 2001:1.7, 2002:3.6}}
frame3 = pd.DataFrame(pop)
frame3

  • 데이터 전치
frame3.T

  • 중첩된 dic을 이용해 DF을 생성할 때, 안쪽의 dictionary의 key값을 중심으로 조합을 해서 index를 만드는데 이때 index를 직접 지정하는 경우 지정된 index로 DF를 생성
pd.DataFrame(pop, index=[2001, 2002, 2003])

pdata = {'Ohio' : frame3['Ohio'][:-1],
					'Nevada' : frame3['Nevada'][:2]}
pd.DataFrame(pdata)

  • index와 columns에 name 속성을 지정하는 경우 이와 함께 출력
frame3.index.name = 'year' ; frame3.columns.name = 'state'
frame3

  • values 속성은 DF에 저장된 데이터를 2차원 array로 반환
frame3.values

  • column들이 서로 다른 dtype을 가지고 있는 경우, 모든 col을 수용하기 위해 그 column의 dtype을 선택
frame2.values

  • 다른 타입들을 모두 수용하기 위해 dtype=object로 선택됨

색인객체

  • 표 형식의 데이터에서 각 low와 col에 대한 이름과 다른 메타데이터(축의 이름 등)을 저장하는 객체
  • Series나 Data Frame 객체를 생성할 때 사용되는 배열이나 다른 순차적인 이름은 내부적으로 index로 변환됨
obj = pd.Series(range(3), index=['a', 'b', 'c'])
index = obj.index
index  # <- 색인 객체
  • 색인객체는 변경이 불가함
index[1] = 'd'

  • index는 mutable한 동작을 지원하지 않는다는 오류 발생
  • 색인 객체의 변경이 불가능하기 때문에 자료구조 사이에서 안전하게 공유될 수 있음
labels = pd.Index(np.arange(3))
# labels에는 0~2까지의 index 객체를 할당

obj2 = pd.Series([1.5, -2.5, 0] ,index=labels)
# obj2에는 Series 객체가 할당되었으며, 이 객체의 index는 labels에 저장된 index 객체를 이용함

obj2.index is labels
# True 반환
  • pandas의 index는 중복되는 값을 허용함
dup_lables = pd.Index(['foo', 'foo', 'bar', 'bar'])
dup_lables

  • 하지만 중복되는 index를 선택하는 경우 해당 값을 가진 모든 index가 선택됨
  • 각각의 index는 자신이 담고 있는 데이터에 대한 정보를 취급하기 위해 여러가지 메서드와 속성을 가지고 있음

append 추가적인 index 객체를 덧붙여 새로운 index를 반환

difference index의 차집합을 반환
intersection index의 교집합을 반환
union index의 합집합을 반환
isin index가 넘겨받은 index 목록에 존재하는지 알려주는 boolean 배열 반환
delete i 위치의 index가 삭제된 새로운 index를 반환
drop 넘겨받은 값이 삭제된 새로운 index를 반환
insert i 위치에 index가 추가된 새로운 index를 반환
is_monotonic index가 단조성(주어진 순서를 보존하는 성질?)을 가진다면 참을 반환
is_unique 중복되는 index가 없다면 참을 반환
unique 중복되는 index 요소를 제거하고 유일한 값만 반환