1. Pandas 개요
1-1. Pandas란?
Pandas는 "Panel Data System"과 "Python Data Analysis"에서 이름을 따온 파이썬 라이브러리로, 데이터 분석을 위해 널리 사용됩니다. R의 데이터프레임(Dataframe)과 유사한 형태의 DataFrame 객체를 핵심으로 하며, 엑셀과 유사한 2차원 데이터 구조로 되어 있어 데이터 전처리 및 가공이 용이합니다. 구글, 페이스북 등 데이터를 분석하는 주요 회사의 데이터 과학자들 대부분이 Pandas를 이용하고 있습니다.
1-2. Pandas의 개발 이유
Pandas는 월스트리트의 투자운용회사(헤지펀드) AQR에서 근무하던 웨스 맥키니에 의해 개발되었습니다. 그는 회사에서 사용하는 데이터 핸들링 툴에 만족하지 못해 Pandas를 개발하게 되었습니다.
개발 계기
- 2008년, 동료가 파이썬으로 간단한 알고리즘을 작성하는 것을 보고 파이썬에 입문하게 되었습니다.
- 파이썬의 SciPy를 접하면서 상용 통계 도구를 대체하는 오픈소스 도구들이 많음을 발견했습니다.
- 스탠포드 대학 조나단 테일러 통계학 교수의 오픈소스 패키지에서 관련 모듈을 발견했습니다.
- 이 오픈소스를 참고하여 R의 DataFrame 객체를 파이썬으로 이식하는 작업에 도전했습니다.
- 도전 1개월 만에 Pandas 초기 버전을 출시하게 되었습니다(2008년 초).
개발자가 회사에서 사용하던 데이터 분석 도구에서 원했던 기능
- 자동적, 명시적으로 축의 이름에 따라 데이터를 정렬할 수 있는 자료구조
- 잘못 정렬된 데이터로 인한 일반적인 오류 예방
- 다양한 소스에서 가져온 다양한 방식으로 색인된 데이터를 다루는 기능
- 통합된 시계열 데이터 처리 기능
- 시계열 데이터와 비시계열 데이터를 함께 다룰 수 있는 통합 자료구조
- 산술 연산과 한 축의 모든 값을 더하는 등의 데이터 축약 연산은 축의 이름 같은 메타데이터로 전달 가능해야 함
- 누락된 데이터를 유연하게 처리할 수 있는 기능
- SQL 같은 일반 데이터베이스처럼 데이터를 합치고 관계 연산을 수행하는 기능
1-3, Pandas의 대표적인 자료구조
Series
- 일련의 객체를 담을 수 있는 1차원 배열 같은 자료구조
- 어떤 NumPy 자료형이라도 담을 수 있음
- 배열의 데이터에 연관된 이름을 가진 색인(Index)을 보유
DataFrame
- 표 같은 스프레드시트 형식의 자료구조
- 여러 개의 칼럼을 가지며 각 칼럼은 서로 다른 종류의 값을 담을 수 있음
- Row나 Column에 대하여 색인(Index)을 보유
Index
- 표 형식의 데이터에서 각 Row와 Column에 대한 이름과 다른 메타데이터(축의 이름)를 저장하는 객체
- DataFrame이나 Series 객체에서 사용됨
Pandas에서는
- DataFrame과 Series만 알면(특히 DataFrame) 대부분의 애플리케이션에서 사용하기 쉽고 탄탄한 기반을 제공할 수 있음
- 다른 자료구조도 있긴 있지만 위의 두 가지가 가장 중요함
- DataFrame은 색인의 모양이 같은 Series 객체를 담고 있는 (파이썬 기본 자료형인)딕셔너리라고 생각하면 편함
2. Pandas 실습 예제
2-1. Series
- Series 객체의 문자열 표현: 왼쪽에 색인, 오른쪽에 해당 색인의 값
- Series의 배열과 색인 객체는 각각 values와 index 속성으로 얻을 수 있음
0 4
1 7
2 -5
3 3
dtype: int64
array([ 4, 7, -5, 3])
RangeIndex(start=0, stop=4, step=1)
- 각각의 데이터를 지칭하는 색인을 지정해서 Series 객체를 생성할 때
d 4
b 7
a -5
c 3
dtype: int64
- 위처럼 색인을 원하는 데이터에 할당해서 지정할 수 있다.
Index(['d', 'b', 'a', 'c'], dtype='object')
7
c 3
a -5
d 6
dtype: int64
- 불리언 배열을 사용해서 값을 걸러내거나 산술 곱셈을 수행하거나 또는 수학 함수를 적용하는 등 NumPy 배열 연산을 수행해도 색인-값은 유지됨
d 6
b 7
c 3
dtype: int64
d 12
b 14
a -10
c 6
dtype: int64
지수함수 계산
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
- Series는 고정길이의 정렬된 딕셔너리라고 생각하면 이해하기 쉬움
True
False
False
True
- 딕셔너리 객체로부터 Series 객체 생성하기
- 딕셔너리 객체만으로 Series 객체를 생성하면 Series 객체의 색인은 딕셔너리의 키 값이 순서대로 들어감
- 시리즈와 딕셔너리 연산들 살펴보기
- 키를 중심으로 동작됨
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
- 누락된 데이터 찾기
California True
Ohio False
Oregon False
Texas False
dtype: bool
California False
Ohio True
Oregon True
Texas True
dtype: bool
California True
Ohio False
Oregon False
Texas False
dtype: bool
- 서로 다르게 색인된 데이터에 대하여 산술 연산 수행하기
- 어느 하나라도 없으면 전부 배제시킴(NaN은 연산이 안됨)
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
----------------------------
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
----------------------------
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
- Name 속성 사용하기
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
0 4
1 7
2 -5
3 3
dtype: int64
----------------------------
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
- 인덱스는 한번 부여하는 것은 가능한데, 바꾸는 것은 불가능함
- 잘못만들어진 인덱스를 변경하는방법은 , 전체 인덱싱을 재 인덱싱하는 방법밖에 없다.
2-2. DataFrame
- DataFrame 생성하기
- 같은 길이의 리스트에 담긴 딕셔너리 이용
- NumPy 배열 이용
- 인덱스를 직접 부여해서 가지고 오기
- row인덱스 부분도 내가 원하는데로 커스텀 가능
- 자동 부여된 인덱스는 항상 부여되지만 숨어있게됨
Index(['year', 'state', 'pop', 'debt'], dtype='object')
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada
Name: state, dtype: object
'Ohio'
one 2000
two 2001
three 2002
four 2001
five 2002
six 2003
Name: year, dtype: int64
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
- Column에는 값을 대입할 수 있음
- 리스트나 배열을 Column에 대입할 때
- 대입하려는 값의 길이가 DataFrame의 크기와 같아야 함 (통째로 집어넣으니까)
- Series를 대입할 경우, DataFrame의 색인에 따라 값이 대입됨.
- 없는 색인에는 값이 대입되지 않음 (있는 것에는 넣고 없는 것에는 넣지 않음)
two -1.2
four -1.5
five -1.7
dtype: float64
-------------------------
- 없는 Column을 대입하면 새로운 Column이 생성됨
Index(['year', 'state', 'pop', 'debt'], dtype='object')
frame2
- 중첩된 딕셔너리를 이용해서 데이터를 생성할 때, 바깥쪽의 딕셔너리의 키 값이 Column이 되고 안에 있는 키는 Row가 됨
안쪽이 로우 인덱스, 바깥쪽이 컬럼 인덱스가 됨
frame3.T
- 중첩된 딕셔너리를 이용해서 데이터를 생성할 때, 안쪽의 딕셔너리의 값은 키 값별로 조합되어 결과의 색인이 됨
- 색인을 직접 지정할 경우, 지정된 색인으로 DataFrame을 생성함
- Series 객체를 담고 있는 딕셔너리 데이터도 동일하게 처리됨
- DataFrame 생성 시 Index와 Column의 이름을 지정할 수 있음
- values 속성은 DataFrame에 저장된 데이터를 2차원 배열로 반환함(Series와 유사)
- DataFrame의 Column에 서로 다른 dType이 있다면 모든 Column을 수행하기 위해 그 Column 배열의 dType이 선택됨
array([[2.4, 1.7],
[2.9, 3.6],
[nan, 1.5]])
array([[2000, 'Ohio', 1.5, nan],
[2001, 'Ohio', 1.7, -1.2],
[2002, 'Ohio', 3.6, nan],
[2001, 'Nevada', 2.4, -1.5],
[2002, 'Nevada', 2.9, -1.7],
[2003, 'Nevada', 3.2, nan]], dtype=object)
2-3. Index
a 0
b 1
c 2
dtype: int64
Index(['a', 'b', 'c'], dtype='object')
Index(['b', 'c'], dtype='object')
- 색인 객체는 변경할 수 없음
- 따라서 색인 객체는 자료구조 사이에서 안전하게 공유할 수 있음
Int64Index([0, 1, 2], dtype='int64')
0 1.5
1 -2.5
2 0.0
dtype: float64
True
Index(['Nevada', 'Ohio'], dtype='object', name='state')
True
False
- 인덱스는 특정 데이터를 가리키는 것이기 때문에 중복 안되고 삭제 x, 판다스에서는 허용함(똑같은 값을 가지면 둘 다 나오게함)
Index(['foo', 'foo', 'bar', 'bar'], dtype='object')
2-4. 기타 주요 기능
- Series나 DataFrame에 저장된 데이터를 다루는 기본 방법들
- 재색인
- 인덱스를 하나씩 바꾸는것은 데이터 신뢰도에 문제 생기기에, 전체를 한번에 바꾸는 재색인은 가능하다.
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
- Method 옵션 사용하기
- 시계열 데이터와 같은 순차적인 데이터를 재색인하고자 할 때, 값을 보간하거나 채워넣어야 할 경우 Method 옵션을 사용하여 해결 가능
- 재색인 기능의 Method 옵션
- ffill 또는 pad : 앞의 값으로 채워 넣기
- bfill 또는 backfill : 뒤의 값으로 채워 넣기
0 blue
2 purple
4 yellow
dtype: object
0 blue
1 purple
2 purple
3 yellow
4 yellow
5 NaN
dtype: object
obj3.reindex(range(6), method='ffill')
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
- DataFrame에서 색인(Row), Column 또는 둘 다 변경 가능
- 하나의 Row 또는 Column 삭제하기
a 0.0
b 1.0
c 2.0
d 3.0
e 4.0
dtype: float64
a 0.0
b 1.0
d 3.0
e 4.0
dtype: float64
a 0.0
b 1.0
c 2.0
d 3.0
e 4.0
dtype: float64
a 0.0
b 1.0
e 4.0
dtype: float64
a 0.0
b 1.0
c 2.0
d 3.0
e 4.0
dtype: float64
기본 axis는 row로 0. 1은 컬럼
a 0.0
b 1.0
d 3.0
e 4.0
dtype: float64
- 색인하기, 선택하기, 거르기
a 0.0
b 1.0
c 2.0
d 3.0
dtype: float64
1.0
----------------------
1.0
----------------------
c 2.0
d 3.0
dtype: float64
----------------------
b 1.0
a 0.0
d 3.0
dtype: float64
----------------------
b 1.0
d 3.0
dtype: float64
----------------------
a 0.0
b 1.0
dtype: float64
- 라벨명으로 슬라이싱 가능하며 이 때는 시작점과 끝점을 포함한다는 것이 파이썬의 기본 슬라이싱과 다름
b 1.0
c 2.0
dtype: float64
----------------------
a 0.0
b 5.0
c 5.0
d 3.0
dtype: float64
데이터 프레임으로 접근
Ohio 1
Colorado 5
Utah 9
New York 13
Name: two, dtype: int64
----------------------
three one
Ohio 2 0
Colorado 6 4ㄴ
Utah 10 8
New York 14 12
- 색인의 위치정보를 이용(인덱스가 가지는 위치정보 이용)
two 5
three 6
Name: Colorado, dtype: int64
four 11
one 8
two 9
Name: Utah, dtype: int64
----------------------
one 8
two 9
three 10
four 11
Name: Utah, dtype: int64
----------------------
four one two
Colorado 7 0 5
Utah 11 8 9
----------------------
Ohio 0
Colorado 5
Utah 9
Name: two, dtype: int64
----------------------
one two three
Colorado 0 5 6
Utah 8 9 10
New York 12 13 14
- 정수 인덱스
0 0.0
1 1.0
2 2.0
dtype: float64
a 0.0
b 1.0
c 2.0
dtype: float64
2.0
0 0.0
dtype: float64
----------------------
0 0.0
1 1.0
dtype: float64
----------------------
0 0.0
dtype: float64
- 산술연산과 데이터 정렬
a 7.3
c -2.5
d 3.4
e 1.5
dtype: float64
a -2.1
c 3.6
e -1.5
f 4.0
g 3.1
dtype: float64
a 5.2
c 1.1
d NaN # 둘중 하나라도 없음 연산 안됨
e 0.0
f NaN
g NaN
dtype: float64
- 산술연산 메소드에 채워넣을 값 지정하기
- 산술연산 메소드: add, sub, div, mul
- DataFrame과 Series 간 연산
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
array([0., 1., 2., 3.])
array([[0., 0., 0., 0.],
[4., 4., 4., 4.],
[8., 8., 8., 8.]])
b 0.0
d 1.0
e 2.0
Name: Utah, dtype: float64
b 0
e 1
f 2
dtype: int64
Utah 1.0
Ohio 4.0
Texas 7.0
Oregon 10.0
Name: d, dtype: float64
- 함수의 적용과 매핑
람다 함수
b 1.142569
d 1.928016
e 1.612983
dtype: float64
Utah 0.686510
Ohio 1.357408
Texas 1.365687
Oregon 0.840383
dtype: float64
Utah -0.27
Ohio 0.38
Texas -1.15
Oregon 0.47
Name: e, dtype: object
- 정렬과 순위(랭크)
d 0
a 1
b 2
c 3
dtype: int64
a 1
b 2
c 3
d 0
dtype: int64
0 4
1 7
2 -3
3 2
dtype: int64
2 -3
3 2
0 4
1 7
dtype: int64
0 4.0
1 NaN
2 7.0
3 NaN
4 -3.0
5 2.0
dtype: float64
4 -3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
- 중복 색인
a 0
a 1
b 2
b 3
c 4
dtype: int64
False #중복이 들어가 있다는 뜻
[ ]
print(obj['a'])
print('----------------------')
print(obj['c'])
a 0
a 1
dtype: int64
----------------------
4
- 기술통계 계산과 요약
one 9.25
two -5.80
dtype: float64
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
one b
two d
dtype: object
0 a
1 a
2 b
3 c
4 a
5 a
6 b
7 c
8 a
9 a
10 b
11 c
12 a
13 a
14 b
15 c
dtype: object
count 16
unique 3
top a
freq 8
dtype: object
- 상관관계와 공분산
0.49976361144151144
8.870655479703546e-05
0.49976361144151144
AAPL 0.386817
GOOG 0.405099
IBM 1.000000
MSFT 0.499764
dtype: float64
AAPL -0.075565
GOOG -0.007067
IBM -0.204849
MSFT -0.092950
dtype: float64
- 유일 값, 값 세기, 멤버십
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
c 3
a 3
b 2
d 1
dtype: int64
c 3
a 3
d 1
b 2
dtype: int64
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
0 c
5 b
6 b
7 c
8 c
dtype: object
0 c
1 a
2 b
3 b
4 c
5 a
dtype: object
0 c
1 b
2 a
dtype: object
array([0, 2, 1, 1, 0, 2])
- 누락된 데이터 처리하기
0 aardvark
1 artichoke
2 NaN
3 avocado
dtype: object
0 False
1 False
2 True
3 False
dtype: bool
0 True
1 False
2 True
3 False
dtype: bool
0 1.0
1 NaN
2 3.5
3 NaN
4 7.0
dtype: float64
0 1.0
2 3.5
4 7.0
dtype: float64
0 1.0
1 NaN
2 3.5
3 NaN
4 7.0
dtype: float64
0 1.0
2 3.5
4 7.0
dtype: float64
0 1.0
1 NaN
2 3.5
3 NaN
4 7.0
dtype: float64
0 1.000000
1 3.833333
2 3.500000
3 3.833333
4 7.000000
dtype: float64
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 기초 14일차 (0) | 2024.07.18 |
---|---|
#파이썬 기초 13일차 (0) | 2024.07.17 |
#파이썬 기초 11일차 (0) | 2024.07.11 |
#파이썬 기초 10일차_2 (0) | 2024.07.10 |
#파이썬 기초 10일차_1 (0) | 2024.07.10 |