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 |