본문 바로가기

😀 기초/판다스(Pandas)

4장 난수 발생과 카운팅(4.0 ~ 4.1_시리즈 클래스)

4.0 판다스 데이터 분석

 

1. 판다스 데이터 분석

- 이 장에서는 판다스(Pandas)패키지를 사용하여 데이터를 분석하는 방법을 공부
- 판다스 패키지는 데이터를 다룰 때 빠질 수 없는 중요한 패키지
- 판다스 패키지를 이용하면 다양한 방법으로 데이터를 조작

 

2. 학습 목표
- 시리즈와 데이터프레임을 만들 수 있다.
- 판다를 이용하여 csv 파일을 읽고 쓸 수 있다.
- 시리즈와 데이터프레임에서 원하는 데이터를 읽고 갱신하는 방법을 익힌다.
- 시지즈와 데이터프레임의 데이터를 조작하는 법을 공부한다
- 멀티 인덱스와 이를 다루는 방법을 학습.
- 둘 이상의 데이터프레임을 하나로 합치는 법을 익힌다.
- 데이터를 그룹으로 나누어 분석하고 피봇테이블을 만드는 방법을 공부한다.


4.1 판다스 패키지의 소개

 

1. ### 4.1 판다스 패키지의 소개
---
- 대부분 데이터는 시계열(series)이나 표(table)의 형태로 나타낼 수 있음
- 판다스 패키지는 이러한 데이터를 다루기 위한 시리즈(Series)클래스와 데이터프레임(DataFrame)클래스 제공

 

2. #### 판다스 패키지 임포트
- 판다스 패키지를 사용하기 위해서 임포트를 해야함

import pandas as pd

3. #### 시리즈 생성
- 데이터를 리스트나 1차원 배열 형식으로 Series 클래스 생성자에 넣어주면 시리즈 클래스 객체를 만듦
- 다음 예에서 "서울", "부산" 등 문자열이 인덱스의 값.
- 인덱스의 값을 인덱스 라벨(label)이라고 함.
- 인덱스 라벨은 문자열 뿐만이 아니라 날짜, 시간, 정수 등도 가능

- 다음 예제는 각 도시의 2015년 인구 데이터를 시리즈로 만든 것

s = pd.Series([9904312, 3448737, 2890451, 2466052,],
             index=["서울", "부산", "인천", "대구"])
s

#결과
서울    9904312
부산    3448737
인천    2890451
대구    2466052
dtype: int64

# 만약 인덱스를 지정하지 않고 시리즈를 만들면
# 시리즈의 인덱스는 0부터 시작하는 정수값이 된다.

pd.Series(range(10, 14))
#결과
0    10
1    11
2    12
3    13
dtype: int64

# 시리즈의 인덱스는 index 속성으로 접근 가능
# 시리즈의 값은 1차원 배열이며 values 속성으로 접근할 수 있음

s.index
#결과
Index(['서울', '부산', '인천', '대구'], dtype='object')

s.values
#결과
array([9904312, 3448737, 2890451, 2466052], dtype=int64)

# name 속성을 이용하여 시리즈 데이터에 이름을 붙일 수 있다.
# index.name 속성으로 시리즈의 인덱스에도 인름을 붙일 수 있다.

s.name = "인구"
s.index.name = "도시"
s
#결과
도시
서울    9904312
부산    3448737
인천    2890451
대구    2466052
Name: 인구, dtype: int64

4. #### 시리즈 연산
- 넘파이 배열처럼 시리즈도 백터화 연산 가능
- 다만! 연산은 시리즈의 값에만 적용되며 인덱스 값은 변하지 않는다.
- 예를 들어 인구 숫자를 백만 단위로 만들기 위해 시리즈 객체를 1,000,000 으로 나누어도
인덱스 라벨에는 영향을 미치지 않는 것을 볼 수 있음

s / 1000000

# 결과
도시
서울    9.904312
부산    3.448737
인천    2.890451
대구    2.466052
Name: 인구, dtype: float64

5. #### 시리즈 인덱싱
- 배열 인덱싱이나 인덱스 라벨을 이용한 슬라이싱(slicing)도 가능하다.

s[1], s["부산"]

#결과
(3448737, 3448737)

s[3], s["대구"]
#결과
(2466052, 2466052)

# 배열 인덱싱을 하면 부분적인 값을 가지는 시리즈 자료형을 반환
# 자료의 순서를 바꾸거나 특정한 자료만 선택할 수 있다.

s[[0, 3, 1]]
#결과
도시
서울    9904312
대구    2466052
부산    3448737
Name: 인구, dtype: int64

s[["서울", "대구", "부산"]]
#결과
도시
서울    9904312
대구    2466052
부산    3448737
Name: 인구, dtype: int64

s[(250e4 < s) & (s < 500e4)] #인구가 250만 초과 500만 미만.
#결과
도시
부산    3448737
인천    2890451
Name: 인구, dtype: int64

# 슬라이싱을 해도 부분적인 시리즈를 반환한다.
# 이 때 문자열 라벨을 이용한 슬라이싱을 하는 경우에는 
# 숫자 인덱싱과 달리 콜론(:) 기호 뒤에 오는 값도 결과에 포함되므로 주의!

s[1:3] # 두번째부터 세번째까지 // (3) 미포함
#결과
도시
부산    3448737
인천    2890451
Name: 인구, dtype: int64

s["부산":"대구"] #부산에서 대구까지
#결과
s["부산":"대구"] #부산에서 대구까지
s["부산":"대구"] #부산에서 대구까지
도시
부산    3448737
인천    2890451
대구    2466052
Name: 인구, dtype: int64

# 만약 라벨 값이 영문 문자열인 경우에는
# 인덱스 라벨이 속성인것처럼 점(.)을 이용하여 해당 이덱스 값에 접근할 수 있다.

s0 = pd.Series(range(3), index=["a", "b", "c"])
s0
#결과
a    0
b    1
c    2
dtype: int64

s0.a
#결과
0

s0.b
#결과
1

6. #### 시리즈와 딕셔너리 자료형
- 시리즈 객체는 라벨 값에 의해 인덱싱이 가능하므로 
- 실질적으로 인덱스 라벨 값을 키(key)로 가지는 딕셔너리 자료형과 같다고 볼 수 있다.
- 따라서 딕셔너리 자료형에서 제공하는 in 연산도 가능하고 items 메서드를 사용하면
- for 루프를 통해 각 원소의 키(key)와 값(value)을 접근할 수 있다.

"서울" in s #인덱스 라벨 중에 서울이 있는가?
#결과
True

"대전" in s
#결과
False

for k, v in s.items():
    print("%s == %d" % (k, v))
 #결과   
서울 == 9904312
부산 == 3448737
인천 == 2890451
대구 == 2466052

- 또 딕셔너리 객체에서 시리즈를 만들 수 있다.
- 이번에는 2010년 인구 자료를 s2라는 이름의 시리즈로 만들어 보자
- 이 데이터에는 대구의 인구 자료는 없지만 대신 대전의 인구 자료가 포함되어 있다.

s2 = pd.Series({"서울": 9631482, "부산": 3393191, "인천": 2632035, "대전": 1490158})
s2
#결과
서울    9631482
부산    3393191
인천    2632035
대전    1490158
dtype: int64

# 딕셔너리의 원소는 순서를 가지지 않으므로 순서가 보장되지 않음
# 만약 순서를 정하고 싶다면 인덱스를 리스트로 지정해야 함.

s2 = pd.Series({"서울": 9631482, "부산": 3393191, "인천": 2632035, "대전":1490158},
              index=["대전", "서울", "인천", "부산"])
s2
#결과
대전    1490158
서울    9631482
인천    2632035
부산    3393191
dtype: int64

7. #### 인덱스 기반 연산
- 이번에는 2015년도와 2010년의 인구 증가를 계산해 보자.
- 두 개의 시리즈의 차이를 구하면 된다.
- 두 시리즈에 대해 연산을 하는 경우 인덱스가 같은 데이터에 대해서만 차이를 구한다.

ds = s - s2
ds

#결과
대구         NaN
대전         NaN
부산     55546.0
서울    272830.0
인천    258416.0
dtype: float64

s.values - s2.values
#결과
array([ 8414154, -6182745,   258416,  -927139], dtype=int64)

- 대구와 대전의 경우네는 2010년 자료와 2015년 자료가 모두 존재하지 않기 때문에
- 계산이 불가능하므로 NaN 값
- 또한 NaN값이 float 자료형이 되었다는 점 주의!
- NaN이 아닌 값을 구하려면 notnull 메서드 사용한다.

ds.notnull()

#결과
대구    False
대전    False
부산     True
서울     True
인천     True
dtype: bool

ds[ds.notnull()]
#결과
부산     55546.0
서울    272830.0
인천    258416.0
dtype: float64

# 마찬가지로 인구 즐가율(%)은 다음과 같이 구할 수 있다.
rs = (s - s2) / s2 * 100
rs = rs[rs.notnull()]
rs
#결과
부산    1.636984
서울    2.832690
인천    9.818107
dtype: float64

8. #### 데이터의 갱신, 추가, 삭제

rs["부산"] = 1.63
rs

#결과
부산    1.630000
서울    2.832690
인천    9.818107
dtype: float64

rs["대구"] = 1.41
rs
#결과
부산    1.630000
서울    2.832690
인천    9.818107
대구    1.410000
dtype: float64

del rs["서울"]
rs
#결과
부산    1.630000
인천    9.818107
대구    1.410000
dtype: float64

'😀 기초 > 판다스(Pandas)' 카테고리의 다른 글

4.3 데이터프레임 고급 인덱싱  (0) 2022.01.30
4.2 데이터 입출력  (0) 2022.01.28
4.1장 판다스 패키지의 소개(4.1_데이터프레임 클래스)  (0) 2022.01.26
3장 기술 통계(3.4)  (0) 2022.01.25
판다스  (0) 2022.01.18