풀스택 개발 학습 과정/데이터

[데이터 분석] Pandas - 1

육츠 2023. 11. 11. 10:25

판다스 개요

판다스는 데이터 조작 및 분석을 위해 파이썬 프로그래밍 언어로 작성된 소프트웨어 라이브러리이다.
일명 파이썬의 엑셀이라 부른다.
URL : https://pandas.pydata.org

 

pandas - Python Data Analysis Library

pandas pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language. Install pandas now!

pandas.pydata.org

 

판다스 불러오기

판다스는 일반적으로 pd라는 별칭으로 불러온다.

import pandas as pd
import numpy as np

Pandas에서 사용하는 자료구조

* 판다스의 구성요소
1) Series
- DataFrame 중에서 하나의 column 에 해당하는 데이터
- 1 차원 데이터 (index, values 2가지 요소로 구성)

2) Dataframe
- Data Table 전체를 의미하는 데이터
- 2차원 데이터 (index, values, colmns 3가지 요소로 구성)

3) Index
- Series 나 Dataframe 의 인덱스를 구성하는 데이터

시리즈 Series
인덱스 값을 명시적으로 지정하지 않으면 0부터 시작하는 일련번호로 자동 지정된다. 하지만 인덱스를 직접 전달할 수도 있다.

nums = [2,3,5,7,9]
sr = pd.Series(nums) # 객체 생성
print(sr)
print(type(sr)) # <class 'pandas.core.series.Series'>

# 0    2
# 1    3
# 2    5
# 3    7
# 4    9
# dtype: int64
--------------------------------------------------------------------------------------
# 인덱스 설정
sr = pd.Series(nums, index=list('abcde'))
print(sr)

menu_list = ['토스트','제육볶음','치킨']
index_list = ['아침','점심','저녁']
sr = pd.Series(menu_list,index=index_list)
print(sr)
# 아침     토스트
# 점심    제육볶음
# 저녁      치킨
# dtype: object
print(sr.index)
# Index(['아침', '점심', '저녁'], dtype='object')

print(sr.index.values) # 넘파이 다차원 배열
# ['아침' '점심' '저녁'] : 인덱스 값만

print(sr.values) # 넘파이 다차원 배열
# ['토스트' '제육볶음' '치킨'] : 값만

 

딕셔너리를 이용해서 시리즈를 생성할 수도 있다.

dic_data = {'a':21, 'b':22,'c':23,'d':24,'e':25}
sr = pd.Series(dic_data, dtype = np.float32) # 형변환
print(sr)

 

원소 선택

print(sr[0]) # 21.0
print(sr['a'])

# a    21.0
# b    22.0
# c    23.0
# dtype: float32

print(sr['a':'c']) # 마지막 요소까지 포함
print(sr[0:3]) # 마지막 인덱스 포함하지 않음

 

- unique(), value_counts()
unique() : 결측치를 포함하며 중복된 데이터를 제외한 데이터의 종류를 ndarray로 반환한다.
value_counts() : 결측치를 포함하지 않으며 데이터 종류별 개수를 Series 로 반환한다.

sr = pd.Series(['A','B','A', np.NaN,'C','D','D','A'])
print(sr.unique()) # 결측치 포함 # ['A' 'B' nan 'C' 'D']
print(sr.value_counts()) # 결측치 미포함 
# A    3
# D    2
# B    1
# C    1

 

데이터프레임 DataFrame
display(df) : 데이터 프레임 형태로 결과를 보여준다.

 nums = np.arange(1,10).reshape(3,3)
print(nums)

df = pd.DataFrame(nums)
# print(df)
display(df)

 

인데스나 컬럼을 직접 전달할 수도 있다.

menu = [['토스트','시리얼','스크램블'],
        ['제육볶음','칼국수','육개장'],
        ['치킨','삼겹살','라면']]

index = ['아침','점심','저녁']
column = ['mon', 'tue', 'wed']

df = pd.DataFrame(menu, index, column) # 위치 인수
display(df)

print(df.index) # Index(['아침', '점심', '저녁'], dtype='object')
print(df.columns) # Index(['mon', 'tue', 'wed'], dtype='object')
print(df.values)
# [['토스트' '시리얼' '스크램블']
#  ['제육볶음' '칼국수' '육개장']
#  ['치킨' '삼겹살' '라면']]

 

딕셔너리를 이용한 데이터 프레임 생성도 가능하다.

# 키에 매핑된 value는 리스트 형태로 만들어야 한다.
data = {
    '이름' : ['홍길동','전우치','손오공','사오정','저팔계'],
    '나이' : [32, 27, 30, 31, 33],
    '전화번호' : ['010-111-1111','010-222-2222','010-333-3333','010-444-4444','010-555-5555']
}
df = pd.DataFrame(data, index=np.arange(1, 6))
display(df)

 

데이터 조회 및 처리

데이터 조회 및 처리를 위한 샘플 생성(10,10 으로 구성된 정수로된 데이터프레임)

import numpy as np
import pandas as pd

data = np.random.randint(100, size = (10,10)) # 0 ~ 99 , (10,10)
df = pd.DataFrame(data,index= list('abcdefghij'), columns=list('ABCDEFGHIJ'))
display(df)

 

데이터 조회
열 값 읽기: df[열명] / df.열명
한 컬럼만 데이터를 읽어올때는 시리즈의 형태로 반환, 복수의 데이터를 읽어올때 애는 데이터프레임으로 반환한다.
df.[[열명]] 으로 읽어온다면 데이터프레임으로 읽어온다.

# print(df.A) # 한 컬럼  = 시리즈 형태로 반환  
print(df['A'])

print(df[['A','B']]) #  데이터 프레임으로 반환 
# 컬럼 이름을 리스트로 전달하면 결과는 데이터 프레임으로 반환
# print(type(df[['A']])) #  데이터 프레임으로 반환

 

행 값 읽기: df.loc[행명]
여러개의 행 값 읽기: 행 이름을 리스트로 전달

df.loc['a'] # ***

df.loc[['a','c','e']]

 

df.head(), df.tail()
상위(하위) n개의 행을 선택한다. 숫자를 선택하지 않으면 5개의 행을 선택한다.

df.head(2)  # 상위 두 개의 행을 읽어옴

df.head() # default 값으로 5개의 행을 읽어옴

 

df.sample()
n 개의 랜덤 데이터 추출

df.sample(2)

데이터 프레임 안에서 2개의 데이터를 랜덤으로 읽어온다.

 

데이터 프레임 정보 조회

- df.dtypes: 컬럼별 데이터 타입 조회
- df.shape: 데이터 프레임의 모양 확인
- df.count(): 데이터의 열마다 non-NA 레코드의 개수를 시리즈 형태로 반환
- df.describe(): 데이터 프레임의 기술 통계 정보 요약
- df.info(): 데이터 프레임의 각 컬럼의 타입 및 null count의 개수 확인

print(df.dtypes)
# A    int32
# B    int32 ...

print(df.shape) # (10, 10)

df.count() # 결측치를 포함하지 않고
# A    10
# B    10

print(df.describe())
#                A          B          C          D          E          F  \
# count  10.000000  10.000000  10.000000  10.000000  10.000000  10.000000   

print(df.info()) # 전반적인 정보 확인 가능
#   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   A       10 non-null     int32
#  1   B       10 non-null     int32