코딩상륙작전 2023. 8. 5. 20:35

* pandas

  • 표 형식의 데이터나 다양한 형태의 데이터를 다루는 데 초점을 맞춰 설계된 라이브러리.
  • pandas는 배열 기반의 함수를 제공하는 등 numpy의 배열 기반 계산 스타일을 많이 차용했다.(numpy는 단일 산술 배열 데이터를 다루는 데 특화되어 있다.)
  • pandas는 Series와 DataFrame 크게 두 가지 자료구조를 갖는다.

 

* import pandas as pd

라이브러리 호출. 관례적으로 pd로 이름을 지음.

# 데이터 불러오기 예시
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data' #Data URL
# data_url = './housing.data' #Data URL
df_data = pd.read_csv(data_url, sep='\s+', header = None) #csv 타입 데이터 로드, separate는 빈공간으로 지정하고, Column은 없음

 

* Series 자료구조(class)

  • Series는 일련의 객체를 담을 수 있는 1차원 배열 같은 자료구조(class)다.(어떤 Numpy 자료형이라도 담을 수 있다).
  • Series는 색인(index)이라는 배열의 데이터와 연관된 이름을 가지고 있다.
  • Series와 DataFrame은 로컬 네임스페이스로 임포트하는 것이 훨씬 편하다.
  • Series는 고정 길이의 정렬된 dictionary라고 생각하면 된다.(색인 값과 데이터 값을 매핑하고 있으므로)
import pandas as pd
from pandas import Series, DataFrame

obj= pd.Series([4, 7, -5, 3])
obj
-----------------
0    4
1    7
2   -5
3    3
dtype: int64

 

1.obj.values : (attribute) 배열을 반환

왼쪽 줄이 index 오른쪽 줄이 values다. 각각의 값은 Series의 attribute를 호출하여 얻을 수 있다.

>>>obj.values
array([ 4,  7, -5,  3])

 

2. obj.index : (attribute) 인덱스의 객체를 반환

obj.index
RangeIndex(start=0, stop=4, step=1)

다음과 같이 index에 이름을 부여할 수도 있다. 또한 대입하여 변경도 가능하다.(obj.index=[...])

obj= pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj
-----------
d    4
b    7
a   -5
c    3
dtype: int64

 

3. 파이썬의 사전 객체로부터 Series 객체를 생성할 수 있다.

capital_data={'한국':'서울', '중국':'베이징', '캐나다':'오타와'}
obj3=pd.Series(capital_data)	# 색인에는 사전의 키값이 순서대로 들어간다.
obj3
-------------
한국      서울
중국     베이징
캐나다    오타와
dtype: object

 

4. name : (attribute) Series 객체와 색인 모두 name속성을 갖고 있다.

obj.name='capital'
obj.index.name='country'
obj
----------
country
한국      서울
중국     베이징
캐나다    오타와
Name: capital, dtype: object

 

* DataFrame

  • DataFrame은 표 같은 스프레이드시트 형식의 자료구조(class)이고, 여러 개의 컬럼이 있는데 각 컬럼은 서로 다른 종류의 값(숫자, 문자열, 불리언 등)을 담을 수 있다.
  • DataFrame은 row와 column에 대한 색인을 가지고 있다.(색인의 모양이 같은 Series 객체를 담고 있는 파이썬 사전과 비슷)
  • 내부적으로 데이터는 리스트나 사전 또는 1차원 배열을 담고 있는 다른 컬렉션이 아니라 하나 이상의 2차원 배열에 저장된다. (물리적으로 2차원이지만 계층적 색인을 이용해서 더 고차원의 데이터를 표현할 수 있다)
  • 흔한 생성 방법은 같은 길이의 리스트에 담긴 사전을 이용하거나 numpy배열을 이용하는 것이다.

 

1. DataFrame의 색인은 Series와 같은 방식으로 자동으로 대입되며 컬럼은 정렬되어 저장된다.(코랩에선 자동 정렬 안 되는 듯 하다.)

data={'state':['Ohio','ohio','ohio', 'Nevada', 'Nevada', 'Nevada'],
      'year': [2000, 2001, 2002, 2001, 2002, 2003],
      'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame=pd.DataFrame(data)
frame
------------------------
	state	year	pop
0	Ohio	2000	1.5
1	Ohio	2001	1.7
2	Ohio	2002	3.6
3	Nevada	2001	2.4
4	Nevada	2002	2.9
5	Nevada	2003	3.2

 

2. frame.head() : 처음 5개의 row만 출력한다.

frame.head()
------------------------
	state	year	pop
0	Ohio	2000	1.5
1	Ohio	2001	1.7
2	Ohio	2002	3.6
3	Nevada	2001	2.4
4	Nevada	2002	2.9

 

3. DataFrame의 column은 사전 형식의 표기법이나 속성 형식으로 접근할 수 있다.

frame['state']
----------------------
frame['state']
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
5    Nevada
Name: state, dtype: object
# 속성 형식으로 column의 values에 접근방식은
# 파이썬에서 사용 가능한 변수 이름 형식일 때만 작동한다.
frame.year	
---------------
0    2000
1    2001
2    2002
3    2001
4    2002
5    2003
Name: year, dtype: int64

 

4. column 추가

frame=pd.DataFrame(data, index=['one','two','three','four','five','six'])

val=pd.Series([-1.2, 1.5, -1.7,], index=['two', 'four', 'five'])	# 새로운 series객체 생성

frame['debt']=val	# 존재하지 않는 column을 대입하면 새로운 컬럼을 생성한다.
frame
----------------------------
	state	year	pop	debt
one	Ohio	2000	1.5	NaN	# NaN은 결측값
two	Ohio	2001	1.7	-1.2
three	Ohio	2002	3.6	NaN
four	Nevada	2001	2.4	1.5
five	Nevada	2002	2.9	-1.7
six	Nevada	2003	3.2	NaN

 

5. del 예약어 : column 삭제

# 'eastern' column 생성
frame['eastern']=frame.state=='Ohio'
frame
-----------------
	state	year	pop	debt	eastern
one	Ohio	2000	1.5	NaN	True
two	Ohio	2001	1.7	-1.2	True
three	Ohio	2002	3.6	NaN	True
four	Nevada	2001	2.4	1.5	False
five	Nevada	2002	2.9	-1.7	False
six	Nevada	2003	3.2	NaN	False
# 'eastern' column 삭제
del frame['eastern']
frame.columns
------------------------
Index(['state', 'year', 'pop', 'debt'], dtype='object')	# 뷰

색인을 이용해서 얻은 컬럼은 내부 데이터에 대한 뷰(view)이며 복사가 이루어지지 않는다. 따라서 이렇게 얻은 Series 객체에 대한 변경은 실제 DataFrame에 반영된다. 복사본이 필요할 때는 Series의 copy 메서드를 이용해야한다.

 

6. T : ( attribute) column과 row를 뒤집는다.

frame.T
-----------------------------------
	one	two	three	four	five	six
state	Ohio	Ohio	Ohio	Nevada	Nevada	Nevada
year	2000	2001	2002	2001	2002	2003
pop	1.5	1.7	3.6	2.4	2.9	3.2
debt	NaN	-1.2	NaN	1.5	-1.7	NaN

7. values : (attribute) DataFrame에 저장된 데이터를 2차원 배열로 반환한다.

DataFrame의 column이 서로 다른 dtype을 가지고 있다면 모든 column을 수용하기 위해 그 column의 배열의 dtype이 선택된다.

frame.values
array([['Ohio', 2000, 1.5, nan],
       ['Ohio', 2001, 1.7, -1.2],
       ['Ohio', 2002, 3.6, nan],
       ['Nevada', 2001, 2.4, 1.5],
       ['Nevada', 2002, 2.9, -1.7],
       ['Nevada', 2003, 3.2, nan]], dtype=object)

 

* 참고

https://www.boostcourse.org/ai222

파이썬 라이브러리를 활용한 데이터분석 2판