[이솦] 파이선으로 배우는 AI 기초 23
- 데이터를 처리할 때 판다스 라이브러리를 사용하며, 정형 데이터를 다루는데 중요한 역할을 한다.
- 판다스의 기본 구조에는 시리즈와 데이터 프레임이 있으며, 다양한 데이터 타입을 다룰 수 있다.
- 데이터 프레임과 시리즈를 이용해 데이터 접근, 선택, 연산 등을 할 수 있으며, 머신러닝 데이터 처리에 유용하다.
데이터를 표의 형태로 저장하고 다루는 툴을 스프레드 시트하고 한다. 그중 가장 유명한 것은 엑셀이다. 이런 데이터를 컴퓨터에서는 정형 데이터라고한다. 즉 각 칼럼(column)내용이 어떤 특성을 가지고 있는지 잘 표현된 데이터이다. 정형 데이터는 머신러닝에서도 중요한 역활을 한다. 예를 들어 내일의 날씨 예측이나, 영화의 흥행예측, 내일의 주가 예측등을 을 할때 정형 데이터를 활용한다.
머신러닝에서 사용되는 데이터는 늘 정리된 것만 있는것은 아니다. 사실 정리 안된것들이 더 많다. 데이터를 정리하는 작업에 스프레드 시트를 활용하면 좋다. 파이썬에서는 판다스 라이브러리로 엑셀과 같은 데이터를 처리하고 있다.
오늘은 판다스 라이브러리를 활용해서 원하는 데이터만 뽑아보자.
Pandas
판다스 라이브러리는 문자, 숫자등 다양한 자료형을 갖는 데이터리를 한꺼번에 수정, 재배치, 연산 할수 있을 라이브러리이다. 넘파이에서는 행렬, 벡터등을 배열로 다루지만, 판다스에서는 시리즈 또는 데이터 프레임이라는 자료 구조 형태를 사용한다. 실제로는 데이터 프레임이 더 많다. 시리즈는 넘파이의 벡터와 같은 1차원 형태 이다. 데이터 프레임은 넘파이의 행렬과 같은 2차원 형태 이다. 판다스를 사용하면 시리즈와 데이터 프레엠이라는 데이터 구조로 표현할수 있다.
시리즈 | 데이터 프레임 |
---|---|
1차원배열, 넘파이의 열 벡터 형태( 딕셔너리와 비슷한 구조), 인덱스로 데이터 저장 | 2차원 배열, 넘파이의행렬 형태, 인덱스와 칼럼의 형태로 데이터 저장 |
시리즈
시리즈나 데이터 프레임을 만들기 위해서 판다스 라이브러리를 불러와 보자
import pandas as pd
이름이 길기 떄문에 줄이며 줄이는 것은 본인 정해도 되지만, 대부분 라이브러리를 만든 곳에서 지정해 준다.
판다스 객체.Series([데어터_0, ..., 데이터_n], [index_0, ..., index_n])
이런 형태로 시리즈 데이터를 만들며 S가 대분자로 시작하는걸 주의하자. 함수가 대문자로 시작하는건 많지 많지만 시리즈는 대문자로 시작한다. 데이터 값이 있는 리스트와 인덱스 값이 있는 리스트 두개로 만들수 있다.
friends = pd.Series([49, 30, 42])
friends
여기에는 인덱스가 없다. 인덱스 값을 주지 않으면 0부터 시작하는 기본값을 설정한다. 그래서 출력하면 인덱스 0부터 해서 출력한다. 나중에 데이터 프레음을 배우게 되면 인덱스는 숫자로 자동 생성되는것이 일반적이다.
하지만 이번엔 숫자열이 아닌 문자열로 생성해 보자.
friends = pd.Series([49, 30, 42], ['Eddie', 'Linda', 'Liam'])
friends
이렇게 인덱스 필드를 주어 보자. 딕셔너리 구조와 배우 비슷하다.
이제 시리즈를 만들었으니 속성과 함수를 이용해서 다루어 보자.
시리즈의 특징으로는
Np.NaN, shape, count(), value_counts(), unique() 가 있다.
np.NaN
numpy를 사용해서 하는것으로 NaN은 Not a Number의 약자 이다.
import pandas as pd
import numpy as np
friends-pd.Series([49, 30, 42, np.NaN, 44], ['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
friends.unique()
여기에서는 Elon에 해당하는 값이 NaN이다.
시리즈가 가지고 있는 값중 숫자가 아니거가 잘못 표현된 값을 지정할때 등장
특정 인덱스가 가지는 값이 공백이거나 숫자로 표현할수 없는 어떤 값이 있을 때 등장한다.
shape
판다스의 시리즈와 데이터 프레임이 가진 속성중 하나이다. 객체배울때를 기억하는가? (으음..) 메소드 외에 객체 특징을 설명하는 속성변수가 존재한다. shape 은 시리즈의 모양을 알려 주는 속성 변수이다. 괄호가 없으니 함수는 아니고 속성 변수라는걸 알수 있다.
import pandas as pd
import numpy as np
friends-pd.Series([49, 30, 42, np.NaN, 44], ['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
friends.unique()
Print(friends.shape)
이렇게 하면 결과가 (5,) 라고 나온다. 5개 요소지만 차원은 없다는 의미이다. 즉 1차원으로 요소값이 5개가 있다는 뜻이다. 다시 말하면 5개 값이 행 벡터 형태로 있다는 의미이다. 만약 열 벡터 형태로 저장된다면 (5,1)출력된다.
count()
요소의 개수를 헤아려 주는 함수이다.
import pandas as pd
import numpy as np
friends-pd.Series([49, 30, 42, np.NaN, 44], ['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
friends.unique()
friends.count()
이렇게 하면 결과가 4가 나온다. shape은 5가 나온다. shepe 과 다른 이유는 shape은 NAN을 반영하지만 count() 는 없는 값 취급한다.
unique()
값에 중복을 제외하면 어떤 값들이 있는지 파악하는 함수이다. 데이터 전처리할때 많이 사용하는 함수이다.
import pandas as pd
import numpy as np
friends-pd.Series([49, 30, 42, np.NaN, 44], ['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
friends.unique()
이렇게 하면 요소의 중복이 없기 때문에 전체를 다 출력해 준다.
예를 들어서 남여를 구별하는 데이터가 있다고 하면 남자를 1, 여자를 2로 하다면 1,2에 다른 값을 찾아 주거나, 값을 볼수 있다.
value_counts()
unique()와 밀접한 관계이다. unique한 요소가 몇번 반복되었는지 반복 횟수를 출력해 준다. 생각보다는 자주 사용한다. 어떤 값을 분류 해야 할때 훈련용 데이터에 몇가지의 분류 항목이 있는지(다시 말해서 카테고리) 파악하기에 아주 유용하다.
시리즈 이용한 연산
두개의 시리즈를 더해 보자.
friends1 = pd.Series([49, 30, 42],
['Eddie', 'Linda', 'Liam'])
friends2 = pd.Series([42, 46, 44],
['Liam', 'Elon', 'Jenny'])
friends1 + friends2
이렇게 하면 인덱스에서 Liam만 일치하기 때문에 Liam 인덱스만 더하고 나머지는 NaN을 출력한다.
데이터 프레임
데이터 프레임은 2차원의 배열, 행렬의 형태이며 여러개의 시리즈가 모여진 형태이다. 데이터 프레임은 머신러닝에서 데이터를 처리하는 기본 요소로 사용한다. 데이터 프레임은 3가지 방법으로 만들수 있다.
배열을 이용한 데이터 프레임 생성
시리즈를 이용한 데이터 프레임 생성
딕셔너리를 이용한 데이터 프레임 생성
이중 오늘은 딕셔너리를 통해서 데이터 프레임을 만들어 보자.
dic = {'age': [49, 30, 42],
'weight': [78, 55, 70],
'height': [170, 165, 1751,]
'familyname': ['Chang', 'Kim', 'Lim']}
friends = pd.DataFrame(dic, ['Eddie', 'Linda', 'Liam'])
friends
| **\
age** | weight | height | familyname |
---|---|---|---|
Eddie | 49 | 78 | 170 |
Linda | 30 | 55 | 165 |
Liam | 42 | 70 | 175 |
이렇게 결과가 나온게 된다.
이제 데이터 프레임을 만들었으니 이용해보자. 딕셔너리의 키 값은 데이터 프레임에서 칼럼 이름이 된다. 일반적으로 정형 데이터에서는 칼럼이 속성 또는 특성이라는 이름을 가지게 된다.
friends['familyname']
friends
#familyname 칼럼에 속하는 모든 값을 가지고 오라는 것이다. 조심할것은 Eddie, Linda, Liam은 인덱스 값이다. 데이터 프레임 값이 아니다.
데이터 프레임에서 두개 이상의 값을 가져올때 하나의 리스트에 두 칼럼명을 넣으면 keyerror발생하니 주의해야 한다. 만약 데이터 프레임에서 두개 이상의 값을 가져오고 싶다면,
friends[['age', 'familyname']]
이런식으로 리스트를 2개로 묶어 주어야 한다.
데이터 접근
이번에는 loc()와 iloc() 함수를 이용해서 데이터 접근을 해보자. 일단 딕셔너리 하나를 만들어보자.
dic 'age': [49, 30, 42, 46, 44],
'weight': [78, 55, 70, 80, 50],
'height': [170, 165, 175, 180, 167],
'familyname': ['Chang', 'Kim', 'Lim', 'Han', 'Kang']}
friends = pd.DataFrame(dic, ['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
friends.loc['Elon']
friends
이렇게 딕셔너리를 만들고 인덱스로 5개로 만들어 보자. 이렇게 하면 Elon에 해당하는 행 데이터는 다 가져온다. 즉 loc()는 해당하는 인덱스 명의 행 데이터를 모두 가져오는 함수이다.
또한 loc() 함수를 이용하면 여러개의 인덱스 값의 행 추출도 가능하다.
friends.loc['Linda':'Elon']
이렇게 하면 Linda에서 Elon까지를 가져온다. (엑셀이 생각나네요). 또한 여기에서는 Linda 에서 부터 Elon까지 포함해서 출력한다.
같은 기능을 iloc()함수로 구현해보자.
friends.iloc[1:4]
이렇게 하면 0번부터 시작하기 때문에 인덱스 1번부터 3번까지의 데이터를 가져온다. 주의할점은 인덱스이름으로 할때는 끝까지 들어가지만 숫자로 할때는 마지막 인덱스 번호는 포함되지 않는다.
iloc()함수를 이용하면 열과 행의 값을 동시에 제어가 가능하다.
friends.iloc[1:4, 1:4]
이렇게 하면 1번행-3번행까지, 1번열-3번열까지 잘라서 출력한다.
iloc()
특정 행렬만 가져올수 있다.
friends.iloc[[1,3], [1,3]]
이렇게 하면 1번행과 3번행, 1번열과 3번 열의 데이터를 가지고 구성한다. ( 즉 행과 열로 구분한다)
판다스와 넘파이는 머신러닝에서 매우 많이 사용되는 라이브러리이다. 둘의 차이점은 넘파이는 행렬, 벡터등 수치연상에 집중하고, 판다스는 모든 종류의 데이터를 주로 데이터 프레임 형태인 2차원 형태로 다룬다. 판다스는 머신러닝에서 훈련데이터와 테스트 데이터를 구축하는데 많이 쓰이며 사용자가 다루는 일이 많다. 넘파이는 모델을 구현할때 많이 사용하며, 사용자가 직접 다루기 보다는 라이브러리가 내부에서 호출해서 사용하는 편이 더 많다.
실습
오늘은 데이터 프레임의 데이터중에서 조건에 맞는 데이터만 추출하기를 해보자.
import pandas as pd
dic = {'age': [49, 30, 42, 46, 44],
'weight': [78, 55, 70, 80, 50],
'height': [170, 165, 175, 180, 167],
'familyname': ['Chang', 'Kim', 'Lim', 'Han', 'Kang']}
friends = pd.DataFrame(dic, index=['Eddie', 'Linda', 'Liam', 'Elon', 'Jenny'])
for x in range(len(friends)):
if friends['familyname'].iloc[x] == 'Kim':
print(friends.iloc[x])
리스트에서 family name을 찾는데 iloc(x) 로 지칭하면 첫 행부터 Kim을 찾아서 출력해 준다.
요약
데이터 프레임이라는 정형 데이터를 처리할때 판다스 라이브러리를 사용
판다스는 시리즈와 데이터프레임 이라는 구조를 사용
데이터 프레임은 2차원배열, 시리즈, 딕셔너리 로 만들수 있음
데이터 프레임은 loc(), iloc()함수로 접근이 가능하다.
판다스는 데이터를 스프레드시트에서 자주 보는 프레임 형태로 처리하는 라이브버리이다. 특히 머신러닝의 훈련 데이터를 처리할때 아주 빈번하게 활용된다.