관리 메뉴

공부 기록장 💻

[Python/Pandas] Python for Data Analysis CH5 Pandas (Series, DataFrame) 본문

# Language & Tools/Python

[Python/Pandas] Python for Data Analysis CH5 Pandas (Series, DataFrame)

dream_for 2022. 10. 21. 16:29

Python for Data Analysis CH5. Panadas
데이터 분석을 위한 파이썬 판다스 라이브러리

Pandas 자료구조

  • 파이썬에서 쉽고 빠르게 데이터를 분석하고 다루기 위한 자료구조와 도구들을 포함함
  • 기존 python 라이브러리와 가장 큰 차이는, for문을 사용하지 않고 데이터를 처리하거나 배열 기반의 함수를 제공하는 등 NumPy 배열 기반 계산 스타일을 많이 차용하여, 테이블 기반 및 이종의 데이터를 쉽게 다룰 수 있게 된다는 점
    • NumPy와 다른 점은, pandas는 표 형식의 데이터나 다양한 형태의 데이터를 다루는데 초점을 맞춰 설계했다는 점 (Numpy는 단일 산술 배열 데이터를 다루는데 특화되어 있음)
  • 다른 산술 계산 도구인 NumpySciPy , 분석 라이브러리인 statsmodelsscikit-learn , 시각화 도구인 matplotlib 과 함꼐 사용한다.
import pandas as pd
from pandas import Series, DataFrame


1. pandas 자료구조 소개

Series 자료구조

  • Series : 일련의 객체를 담을 수 있는 1차원 배열 같은 자료구조이다.
  • **색인(index)** 기능을 제공 (원소 값의 순서) - 왼쪽에는 색인을, 오른쪽에는 해당 색인의 값을 보여줌 (0~N-1)
  • obj.index , obj.values 를 통해 인덱스와 값을 얻을 수 있다.
  • index 속성을 통해 직접 색인을 지정 가능하다.
  • 단일 값을 선택할 때에는 obj['b'] , 여러 값을 선택할 때에는 obj[['c', 'a', 'b']] 와 같이 색인으로 라벨을 사용할 수 있다.
def SeriesFunction():
    obj = pd.Series([4,7,-5,3]) # 배열을 키(인덱스)-값 쌍의 사전 데이터로 변경
    print(obj) # key-value 모두 출력
    print(obj.values) # value들 출력
    print(obj.index) # 인덱스 key들 출력

    # 인덱스 키값을 직접 부여
    obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
    print(obj2)
    print(obj2.index)

    # 단일 원소값 선택 또는 원소 집합 선택을 위해 인덱스의 레이블 사용
    print(obj2['a']) # 'a' 인덱스에 해당하는 -5 출력
    obj2['d']=6 # 'd' 인덱스에 해당하는 4를 6으로 변경
    print(obj2)

 

Numpy의 기능 사용

  • 산술 곱셈 또는 수학 함수를 적용하는 등 Numpy 배열 연산을 수행해도 색인-값 연결이 유지된다.
def SeriesNumpy():
    # Series자료구조를 가진 객체에 Numpy 함수 기능 적용
    obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
    print(obj2[obj2>0]) # value가 0보다 큰 경우 출력
    print(obj2*2)
    print(np.exp(obj2))

사전 자료형

  • Series는 고정 길이의 정렬된 사전형이라고 생각할 수 있다. 색인 값에 데이터 값을 매핑하고 있으므로 파이썬의 사전형과 비슷하다.
  • 파이썬 사전 객체로부터 Series 객체 생성 가능
  • 직접 배열을 index 속성으로 넣어 색인을 직접 지정할 수 있다. (해당 키에 해당하는 값이 순서대로 나타남)
  • pd.isnull(obj) , pd.notnull(obj): 누락된 데이터가 있는지 불리언 배열로 확인 가능
# 사전 자료형으로 구성된 많은 데이터에 대해 적용하여 사용
def SeriesDictionary():
    sdata = {"Ohio":35000, "Texas":71000, "Oregon":16000, "Utah":5000}
        print("Ohio" in sdata) # True
    obj3 = pd.Series(sdata) # 사전 자료형인 sdata로부터 Series 객체 생성
    print(obj3)

    # 사전 자료형으로 시리즈 객체 생성 시 사전의 키 값이 순서대로 시리즈 객체의 인덱스로 지정
    # 인덱스를 찾을 수 없는 경우 NaN(not a number)로 표시
    states = ["California", "Ohio", "Oregon", "Texas"]
    obj4 = pd.Series(sdata, index=states)
    print(obj4)

    # missing data 탐색
    print(pd.isnull(obj4))
    print(pd.notnull(obj4))

        # 산술 연산 시 자동으로 키들을 매핑하여 연산 가능
        print(obj3 + obj4)
  • name 속성을 지정 가능
  • Series의 색인은 직접 대입하여 변경도 가능하다.
obj4.name = 'population' # Series의 객체 이름 지정
obj4.index.name = 'state' # 인덱스 이름 지정

obj.index = ['Bob', 'Joe', 'Seve', 'Ryan']

DataFrame 자료구조

  • 표 같은 스프레드 시트 형식의 자료구조이며, 여러 개의 컬럼이 있는데 각 칼럼은 서로 다른 종류의 값(문자, 숫자, 문자열, 불리언 등)을 담을 수 있다.
    • 즉, 여러 Column으로 구성된 테이블 방식의 데이터를 표현하는 자료구조이다.
  • 로우와 컬럼에 대한 색인을 가지고 있는데, 색인의 모양이 같은 Series 객체를 담고 있는 파이썬 사전으로 생각할 수 있다.
  • 내부적으로 데이터는 리스트나 사전, 1차원 배열을 담고 있는 다른 컬렉션이 아니라, 하나 이상의 2차우 ㅓㄴ 배열에 저장된다.
  • pd.DataFrame(data) 로 데이터프레임을 생성한다.
  • 각 컬럼은 서로 다른 형태의 데이터를 표현할 수 있고, row와 column에 대한 인덱스를 가짐
    • 기본적으로 첫번째 칼럼은 0~N-1의 정수 인덱스 색인을 가진다.
    • columns 속성 : 칼럼의 위치를 직접 지정
    • index 속성 : 각 행의 인덱스를 직접 지정
  • pd.head() : 첫 5개 행 데이터 출력
def DataFrameFunc():
    # 각 칼럼의 색인과 데이터들
    data = {
        "state" : ["Ohio", "Ohio", "Ohio", "Nevada", "Nevada", "Nevada"], # state 칼럼
        "year" : [2000,2001,2002,2001,2002,2003], # year 칼럼
        "pop" : [1.5,1.7,3.6,2.4,2.9,3.2] # pop 칼럼
    }
    frame = pd.DataFrame(data) # data를 판다스의 데이터프레임 객체로 생성
    print(frame)
        print(frame.columns, frame.index)
    print(frame.head()) # 첫 5개 행의 정보를 추출


    # columns를 지정하면 데이터를 지정된 순서로 관리 가능
    frame2 = pd.DataFrame(data, columns=["year","state","pop"])
    print(frame2)

        # 직접 색인 인덱스의 이름 지정 가능
    frame3 = pd.DataFrame(data, columns=["year", "state", "pop", "debt"],
                          index=["one", "two", "three", "four", "five","six"])
    print(frame3) # `debt` 에 대한 칼럼 데이터들은 결측치로 나타남
  • 사전 표기법 또는 속성 값으로 데이터에 접근 가능
  • # 사전과 같은 표기법 또는 속성 값으로 특정 데이터에 접근 가능 print(frame2["state"]) print(frame2.year)
  • 로우의 경우, loc[] 속성을 이용해 이름을 통해 접근 가능
  • print(frame2.loc['three'])
  • 배열에 직접 값을 할당 가능하다.
  • # 비어있는 칼럼에는 스칼라 값이나, 배열의 값이 할당 될 수 있음 frame3["debt"] = np.arange(6) print(frame3) # 배열 값 할당 val = pd.Series([-1.2, -1.5, -1.7], index=["two", "four", "five"]) # 지정한 인덱스에 대한 값만 할당 frame3["debt"]=val print(frame3)
  • 새로운 칼럼 추가, 삭제 (del 예약어)
  • # eastern 칼럼 추가 (Ohio state인 경우에만 True값 부여) frame3["eastern"]=(frame3.state=="Ohio") print(frame3) # 칼럼 삭제 del frame3["debt"] print(frame3)
  • 중첩된 사전을 이용해 데이터 생성
    • 바깡테 있는 사전의 키는 컬럼이 되고, 안에 있는 키는 로우가 된다.
    • pop = {'Nevada' : {2001:2.4, 2000:2.3}, 'Ohio' : {2000:1.5, 2001: 3.4, 2002: 3.6}} frame3 = pd.Dataframe(pop) print(frame3) # Nevada와 Ohio가 칼럼, 2000/2001/2002가 로우가 됨
  • frame3.T 를 이용해 전치 가능 (로우와 컬럼이 뒤집어짐)
  • 직접 색인 지정 가능 : pd.DataFrame(pop, index=[2001, 2002, 2003])

색인 객체(Index Objects)

  • Pandas 인덱스 객체는 테이블 형식의 데이터에서, 각 축에 대한 레이블과 메타 데이터를 다룸
  • Series, Data Frame 객체 생성할 때 배열이네 레이블의 순서가 내부적으로 인덱스로 변환됨
  • 파이썬의 사전과 달리 중복되는 인덱스 값을 허용함
def PandasIndexes():
    # 인덱스 객체
    obj = pd.Series(range(3), index=['a', 'b', 'c'])
    print(obj, obj.index) 

        # 인덱스, 칼럼 포함 여부 확인
        print('a' in obj.columns) # True
        print(3 in obj.index) # False

2. 핵심 기능

  • Series나 DataFrame에 저장된 데이터를 다루는 핵심적인 기능을 살펴보자.

재색인

  • reindex() : 새로 재배치한 인덱스에 맞게 데이터을 재배열하고, 존재하지 않는 새로운 색인값에 대홰서는 NaN으로 채운다.
    obj2 = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
    print(obj2)

        # 재색인(Reindex) : 인덱스의 배열을 변경 (없던 인덱스 추가 시 NaN 추가)
    obj3 = obj2.reindex(['a', 'b', 'c', 'd', 'e'])
    print(obj3)
  • method=ffill 옵션 추가 : 누락된 값을 직전의 값으로 채워넣음
    • 시계열 같은 순차적인 데이터를 재색인할 때 값을 보간하거나 채워 넣어야 하는 경우에 사용됨
    obj = pd.Series(['blue', 'purple', 'yellow'], index=[0,2,4])
    obj4 = obj.reindex(range(6), method='ffill') # index=1 은 0의 값으로, 3은 2의 값으로, 5는 4의 값으로 채움
    print(obj4)
  • 재색인은 로우(색인), 컬럼 둘다 변경 가능 (재배치 기능)
    • columns 예약어를 통해 칼럼 재색인 가능
    frame = pd.DataFrame(np.arange(9).reshape(3,3),
                         index=['a','b','c'],
                         columns=['Ohio', 'Texas', 'California'])
    print(frame)
    frame2 = frame.reindex(['a', 'b', 'c', 'd']) # d 칼럼 추가
    print(frame2)

    # columns 키워드를 사용해 DataFrame 컬럼 재색인 가능
    states = ['Texas','Utah','California'] # Ohio 컬럼은 제외, Utah를 새로 생성
    frame2 = frame.reindex(columns=states) # Utah에 대해서는 NaN으로 채움
    print(frame2)
  • 재색인은 loc을 이용해 라벨로 색인하면 좀 더 간결하게 할 수 있다.
frame.loc[['a', 'b', 'c', 'd'], states]

엔트리 삭제 (Dropping entries from an axis)

  • 로우나 컬럼을 쉽게 삭제할 수 있다. 이는 데이터의 모양을 변경하는 작업을 진행한다.
  • drop 메소드를 통해 축으로부터 지정된 값(칼럼)을 삭제한 새로운 객체 리턴
  • 크기 또는 형태를 변경하는 함수는 새로운 객체 반환 대신 원본 객체를 변경한다.
def DroppingEntries():
    obj = pd.Series(np.arange(5.), index=['a','b','c','d','e'])
    print(obj)

    new = obj.drop('c') # C 로우 삭제 (해당 로우의 데이터 모두 삭제)
    print(new)
    new = obj.drop(['d','c']) # 동시에 여러 로우 삭제
    print(new)

    data = pd.DataFrame(np.arange(16).reshape((4,4)),
                        index=['Ohio','Colorado','Utah','New York'],
                        columns=['one','two','three','four'])
    print(data)
    d1 = data.drop(['Colorado', 'Ohio'])
    print(d1)
  • 컬럼의 값을 삭제할 때에는 axis=1 또는 axis='columns' 를 인자로 넘겨주면 된다.
728x90
반응형
Comments