Python

[Python] Pandas

SangRok Jung 2022. 9. 27. 23:14
반응형

PANDAS


  • 파이썬의 데이터 분석 라이브러리
  • 데이터 테이블을 다루는 도구입니다.
  • 표데이터를 분석하기 위한 도구들이 SQL 보다 더 많습니다.

 

▶ 기본적으로 넘파이를 사용합니다.

  • 넘파이 : 파이썬에서 배열을 다루는 최적의 라이브러리
  • 판다스는 넘파이를 효율적으로 사용하기 위해 인덱싱, 연산, 전처리 등 다양한 함수를 제공합니다.

 

 

 

 

 

Pandas의 개념


DataFrame : 데이터 테이블 전체 객체.

Series : 각 열 데이터를 다루는 객체. (하나의 Vector)

 

 

 

 

 

시리즈 객체


  • Feature vector와 같은 개념입니다.
    • 일반적으로 하나의 피쳐 데이터를 포함하는 형태입니다.
    • 생성된 데이터 프레임 안에 포함될 수 있습니다.
    • list, dict, ndarray 등 다양한 데이터 타입이 시리즈 객체 형태로 변환되기도 합니다.

 

 

▶ 시리즈 객체 생성시 세 가지 property(요소).

시리즈(Series) 객체는 넘파이 배열(ndarray)의 하위 클래스 입니다.

  • data
    • 기존 다른 객체처럼 값을 저장하는 요소.
  • Index
    • 항상 0부터 시작하고, 숫자로만 할당하는 값
    • 시리즈 객체에서는 숫자, 문자열, 0 외의 값으로 시작하는 숫자, 순서가 일정하지 않은 숫자를 입력할 수 도 있습니다.
    • 중복을 허용합니다.
  • data type 
    • 넘파이의 데이터 타입과 일치합니다.
    • 판다스는 넘파이의 wrapper library
    • 넘파이의 모든 기능을 지원하고 데이터 타입도 그대로 적용합니다.

 

 

 

 

 

 

시리즈 객체 생성


데이터 프레임 객체를 먼저 생성하고 각 열에서 시리즈 객체를 뽑는 것이 일반적인 방법입니다.

판다스의 모든 값은 인덱스값을 기준으로 생성합니다.

 

 

▶ Pandas 모듈 호출

기존 아나콘다는 설치가 되어 있습니다.

import pandas as pd

 

 

▶ 리스트 → 시리즈

list_data = [1, 2, 3, 4, 5]
example_obj = pd.Series(list_data)

print(example_obj)
# 0    1
# 1    2
# 2    3
# 3    4
# 4    5
# dtype: int64

 

 

 

▶ 인덱스 별칭 지정

list_data = [1, 2, 3, 4, 5]
list_name = ["a",  "b", "c", "d", "e"]
example_obj = pd.Series(data = list_data, index = list_name)

print(example_obj)
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64

 

 

 

 

사전 → 시리즈

기존 데이터에 더 많은 인덱스 값을 추가 하면 Nan값이 출력됩니다.

dict_data_1 = {"a" : 1, "b":2, "c":3, "d":4, "e":5}

indexex = ["a", "b", "c", "d", "e", "f", "g", "h"]

series_obj_1 = pd.Series(dict_data_1, index=indexex)

print(series_obj_1)
# a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    5.0
# f    NaN
# g    NaN
# h    NaN
# dtype: float64

 

 

 

 

▶ 데이터 타입 설정

다양한 시퀀스형 데이터 타입으로 저장이 가능합니다.

dict_data = {"a" : 1, "b":2, "c":3, "d":4, "e":5}

series_obj_1 = pd.Series(dict_data, dtype = np.float32)

print(series_obj_1)
# a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    5.0
# dtype: float32

 

 

 

 

▶ 시리즈 이름 지정

* 거의 사용하지 않습니다

dict_data = {"a" : 1, "b":2, "c":3, "d":4, "e":5}

example_obj = pd.Series(dict_data, dtype = np.float32, name = "example_data")

print(example_obj)
# a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    5.0
# Name: example_data, dtype: float32

 

 

 

 

▶ 데이터 정보 확인

print(example_obj.values)
# [1. 2. 3. 4. 5.]

print(example_obj.index)
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

print(example_obj.dtype)
# float32

print(type(example_obj.values))
# <class 'numpy.ndarray'>

 

 

 

 

▶ 시리즈 객체의 이름 변경

  • 열의 이름을 지정해주는 방식입니다.
  • 인덱스 이름도 추가로 지정이 가능합니다.
example_obj.name = "number"
example_obj.index.name = "id"
example_obj

# id
# a    1.0
# b    2.0
# c    3.0
# d    4.0
# e    5.0
# Name: number, dtype: float32

 

 

 

▶ 데이터 추출하기

# series_obj_1의 1번째 원소를 선택 합니다.
print(series_obj_1[1])
# 2.0


# b라벨을 가진 원소를 선택합니다.
print(series_obj_1["b"])
# 2.0


# c와 e원소를 선택합니다.
print(series_obj_1[["c", "e"]])
print(series_obj_1[[2, 4]])
# c    3.0
# e    5.0
# dtype: float32


# b에서 d까지의 원소를 선택합니다.
print(series_obj_1['b':'d']) # 별칭을 타겟으로 지정 할 경우 미만의 개념이 없습니다.
print(series_obj_1[1:4])
# b    2.0
# c    3.0
# d    4.0
# dtype: float32

 

 

 

 

데이터 프레임 객체 


  • 데이터 테이블 전체를 지정하는 객체
  • 넘파이 배열의 특성을 그대로 가집니다.

* 인덱싱 : 열과 행 각각 사용하여 하나의 데이터로 접근합니다.

 

 

 

▶ 데이터프레임 생성

 

▷ 딕셔너리로 생성

딕셔너리 타입 데이터에서 Key는 colum, Value는 시퀀스형 데이터 타입을 입력하여 각 열의 데이터를 만듭니다.

table = {"나이" : [15, 17],
        "성별" : ['남', "여"],
        "학교" : ["덕영중", "수리중"]}

pd.DataFrame(table, index=["준서","예은"])

 

▷ 벡터로 생성

# 두개의 벡터로 생성
v1 = [15, '남', '덕영중']
v2 = [17, '여', '수리중']
pd.DataFrame([v1, v2], columns=["나이", "성별", "학교"], index=["준서", "예은"])

 

 

 

 

▶ index, column 추출

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
            'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
            'age': [42, 52, 36, 24, 73],
            'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}

df = pd.DataFrame(raw_data)

print(df.index)
# RangeIndex(start=0, stop=5, step=1)

print(df.columns)
# Index(['first_name', 'last_name', 'age', 'city'], dtype='object')

print(df.columns[3])
# city

 

 

 

▷ 데이터 생성시, Column 이름을 한정하면 해당 Row만 추출합니다.

pd.DataFrame(raw_data, columns = ["age", "city"])

 

 

▷ 데이터가 존재하지 않는 Row를 추가하면 해당 Row에는 NaN값을 추가합니다.

pd.DataFrame(raw_data, columns = ["age", "city", "debt"])

 

 

 

 

 

▶ Column, row 이름 변경

df = pd.DataFrame(raw_data)

df.index = ["student1", "student2", "student3", "student4", "student5"]
df.columns = ['이름', "성", "나이", "지역"]

print(df)
#              이름         성  나이             지역
# student1  Jason    Miller  42  San Francisco
# student2  Molly  Jacobson  52      Baltimore
# student3   Tina       Ali  36          Miami
# student4   Jake    Milner  24        Douglas
# student5    Amy     Cooze  73         Boston

 

 

 

 

 

▷ 각각의 column과 row를 타겟을 지정하여 변경합니다.

inplace의 값을 True로 입력해야 원본이 변경됩니다.

# 컬럼 이름중 '나이'를 '연령'으로 '지역'을 '도시'로 변경합니다.
df.rename(columns = {"나이" : "연령", "지역" : "도시"}, inplace = True)

# 행 인덱스 중에서 'student1'을 '학생1'로 변경합니다.
df.rename(index={'student1' : "학생1"}, inplace=True)

 

 

 

 

▷ # axis의 값이 기본 값이 0이기 때문에 'index=' 입력하지 않아도 index가 변경됩니다.

df.rename({'student2' : "학생2"})

 

 

 

 

 

 

데이터 로딩


▶ openpyxl 모듈 설치

!conda install --y openpyxl

 

 

▶ read_excel 함수로 엑셀 데이터 호출

pd.read_excel("파일 주소")
import pandas as pd # pandas 모듈 호출
import numpy as np # numpy 모듈 호출
df = pd.read_excel("/Users/werther/excel-comp-data.xlsx")

 

 

 

▶ 머리, 꼬리 호출

  • head와 tail 함수 : 처음 n개 행이나 마지막 n개 행 호출
  • 기본으로 5개가 출력됩니다.
df.head()
df.head(2)
df.tail()
df.tail(2)

 

 

 

 

 

▶ 열 이름을 사용한 데이터 추출

 

  • Column 이름을 리스트 형태로 넣어 호출합니다.
  • 가장 일반적인 호출 방법입니다.
  • 문자형 Column 이름을 하나만 넣으면 값이 시리즈 객체로 반환됩니다.
  • Column 이름을 여러개 넣으면 데이터 프레임 객체로 반환됩니다.

 

▷ 데이터 프레임으로 반환.

df[["account", "street", "state"]].head(3)

 

 

 

▷ 시리즈 객체로 반환

df["account"].head(3)

# 0    211829
# 1    320563
# 2    648336
# Name: account, dtype: int64

▷ 동일합니다.

df.account.head(3) # df['account'].head(3)

# 0    211829
# 1    320563
# 2    648336
# Name: account, dtype: int64

 

반응형

'Python' 카테고리의 다른 글

[Python] 데이터 확인  (0) 2022.09.27
[Python] Web scrapping  (0) 2022.09.27
[Python] 파일 저장  (0) 2022.09.27
[Python] numpy 내적연산  (1) 2022.09.24
[Python] numpy  (0) 2022.09.22