일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 카카오 코테
- 시스템호출
- nestjs auth
- @Component
- AWS
- spring boot
- 코테
- C언어
- nestjs typeorm
- python
- 카카오 알고리즘
- git
- 알고리즘
- 컴포넌트스캔
- 가상면접사례로배우는대규모시스템설계기초
- 코딩테스트
- Spring
- 해시
- Nodejs
- 구조체배열
- 카카오
- 파이썬
- OpenCV
- 프로그래머스
- 스프링
- C++
- nestJS
- TypeORM
- @Autowired
- thymeleaf
Archives
- Today
- Total
공부 기록장 💻
[Python/Pandas] Python for Data Analysis CH5 Pandas (Series, DataFrame) 본문
# Language & Tools/Python
[Python/Pandas] Python for Data Analysis CH5 Pandas (Series, DataFrame)
dream_for 2022. 10. 21. 16:29Python for Data Analysis CH5. Panadas
데이터 분석을 위한 파이썬 판다스 라이브러리
Pandas 자료구조
- 파이썬에서 쉽고 빠르게 데이터를 분석하고 다루기 위한 자료구조와 도구들을 포함함
- 기존 python 라이브러리와 가장 큰 차이는, for문을 사용하지 않고 데이터를 처리하거나 배열 기반의 함수를 제공하는 등 NumPy 배열 기반 계산 스타일을 많이 차용하여, 테이블 기반 및 이종의 데이터를 쉽게 다룰 수 있게 된다는 점
- NumPy와 다른 점은, pandas는 표 형식의 데이터나 다양한 형태의 데이터를 다루는데 초점을 맞춰 설계했다는 점 (Numpy는 단일 산술 배열 데이터를 다루는데 특화되어 있음)
- 다른 산술 계산 도구인
Numpy
와SciPy
, 분석 라이브러리인statsmodels
과scikit-learn
, 시각화 도구인matplotlib
과 함꼐 사용한다.
import pandas as pd
from pandas import Series, DataFrame
1. pandas 자료구조 소개
Series 자료구조
Series
: 일련의 객체를 담을 수 있는 1차원 배열 같은 자료구조이다.- **색인(index)** 기능을 제공 (원소 값의 순서) - 왼쪽에는 색인을, 오른쪽에는 해당 색인의 값을 보여줌 (0~N-1)
obj.index
,obj.values
를 통해 인덱스와 값을 얻을 수 있다.index
속성을 통해 직접 색인을 지정 가능하다.- 단일 값을 선택할 때에는
obj['b']
, 여러 값을 선택할 때에는obj[['c', 'a', 'b']]
와 같이 색인으로 라벨을 사용할 수 있다.
def SeriesFunction():
obj = pd.Series([4,7,-5,3]) # 배열을 키(인덱스)-값 쌍의 사전 데이터로 변경
print(obj) # key-value 모두 출력
print(obj.values) # value들 출력
print(obj.index) # 인덱스 key들 출력
# 인덱스 키값을 직접 부여
obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
print(obj2)
print(obj2.index)
# 단일 원소값 선택 또는 원소 집합 선택을 위해 인덱스의 레이블 사용
print(obj2['a']) # 'a' 인덱스에 해당하는 -5 출력
obj2['d']=6 # 'd' 인덱스에 해당하는 4를 6으로 변경
print(obj2)
Numpy의 기능 사용
- 산술 곱셈 또는 수학 함수를 적용하는 등 Numpy 배열 연산을 수행해도 색인-값 연결이 유지된다.
def SeriesNumpy():
# Series자료구조를 가진 객체에 Numpy 함수 기능 적용
obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
print(obj2[obj2>0]) # value가 0보다 큰 경우 출력
print(obj2*2)
print(np.exp(obj2))
사전 자료형
- Series는 고정 길이의 정렬된 사전형이라고 생각할 수 있다. 색인 값에 데이터 값을 매핑하고 있으므로 파이썬의 사전형과 비슷하다.
- 파이썬 사전 객체로부터 Series 객체 생성 가능
- 직접 배열을 index 속성으로 넣어 색인을 직접 지정할 수 있다. (해당 키에 해당하는 값이 순서대로 나타남)
pd.isnull(obj)
,pd.notnull(obj)
: 누락된 데이터가 있는지 불리언 배열로 확인 가능
# 사전 자료형으로 구성된 많은 데이터에 대해 적용하여 사용
def SeriesDictionary():
sdata = {"Ohio":35000, "Texas":71000, "Oregon":16000, "Utah":5000}
print("Ohio" in sdata) # True
obj3 = pd.Series(sdata) # 사전 자료형인 sdata로부터 Series 객체 생성
print(obj3)
# 사전 자료형으로 시리즈 객체 생성 시 사전의 키 값이 순서대로 시리즈 객체의 인덱스로 지정
# 인덱스를 찾을 수 없는 경우 NaN(not a number)로 표시
states = ["California", "Ohio", "Oregon", "Texas"]
obj4 = pd.Series(sdata, index=states)
print(obj4)
# missing data 탐색
print(pd.isnull(obj4))
print(pd.notnull(obj4))
# 산술 연산 시 자동으로 키들을 매핑하여 연산 가능
print(obj3 + obj4)
name
속성을 지정 가능- Series의 색인은 직접 대입하여 변경도 가능하다.
obj4.name = 'population' # Series의 객체 이름 지정
obj4.index.name = 'state' # 인덱스 이름 지정
obj.index = ['Bob', 'Joe', 'Seve', 'Ryan']
DataFrame 자료구조
- 표 같은 스프레드 시트 형식의 자료구조이며, 여러 개의 컬럼이 있는데 각 칼럼은 서로 다른 종류의 값(문자, 숫자, 문자열, 불리언 등)을 담을 수 있다.
- 즉, 여러 Column으로 구성된 테이블 방식의 데이터를 표현하는 자료구조이다.
- 로우와 컬럼에 대한 색인을 가지고 있는데, 색인의 모양이 같은 Series 객체를 담고 있는 파이썬 사전으로 생각할 수 있다.
- 내부적으로 데이터는 리스트나 사전, 1차원 배열을 담고 있는 다른 컬렉션이 아니라, 하나 이상의 2차우 ㅓㄴ 배열에 저장된다.
pd.DataFrame(data)
로 데이터프레임을 생성한다.- 각 컬럼은 서로 다른 형태의 데이터를 표현할 수 있고, row와 column에 대한 인덱스를 가짐
- 기본적으로 첫번째 칼럼은 0~N-1의 정수 인덱스 색인을 가진다.
columns
속성 : 칼럼의 위치를 직접 지정index
속성 : 각 행의 인덱스를 직접 지정
pd.head()
: 첫 5개 행 데이터 출력
def DataFrameFunc():
# 각 칼럼의 색인과 데이터들
data = {
"state" : ["Ohio", "Ohio", "Ohio", "Nevada", "Nevada", "Nevada"], # state 칼럼
"year" : [2000,2001,2002,2001,2002,2003], # year 칼럼
"pop" : [1.5,1.7,3.6,2.4,2.9,3.2] # pop 칼럼
}
frame = pd.DataFrame(data) # data를 판다스의 데이터프레임 객체로 생성
print(frame)
print(frame.columns, frame.index)
print(frame.head()) # 첫 5개 행의 정보를 추출
# columns를 지정하면 데이터를 지정된 순서로 관리 가능
frame2 = pd.DataFrame(data, columns=["year","state","pop"])
print(frame2)
# 직접 색인 인덱스의 이름 지정 가능
frame3 = pd.DataFrame(data, columns=["year", "state", "pop", "debt"],
index=["one", "two", "three", "four", "five","six"])
print(frame3) # `debt` 에 대한 칼럼 데이터들은 결측치로 나타남
- 사전 표기법 또는 속성 값으로 데이터에 접근 가능
# 사전과 같은 표기법 또는 속성 값으로 특정 데이터에 접근 가능 print(frame2["state"]) print(frame2.year)
- 로우의 경우,
loc[]
속성을 이용해 이름을 통해 접근 가능 print(frame2.loc['three'])
- 배열에 직접 값을 할당 가능하다.
# 비어있는 칼럼에는 스칼라 값이나, 배열의 값이 할당 될 수 있음 frame3["debt"] = np.arange(6) print(frame3) # 배열 값 할당 val = pd.Series([-1.2, -1.5, -1.7], index=["two", "four", "five"]) # 지정한 인덱스에 대한 값만 할당 frame3["debt"]=val print(frame3)
- 새로운 칼럼 추가, 삭제 (
del
예약어) # eastern 칼럼 추가 (Ohio state인 경우에만 True값 부여) frame3["eastern"]=(frame3.state=="Ohio") print(frame3) # 칼럼 삭제 del frame3["debt"] print(frame3)
- 중첩된 사전을 이용해 데이터 생성
- 바깡테 있는 사전의 키는 컬럼이 되고, 안에 있는 키는 로우가 된다.
pop = {'Nevada' : {2001:2.4, 2000:2.3}, 'Ohio' : {2000:1.5, 2001: 3.4, 2002: 3.6}} frame3 = pd.Dataframe(pop) print(frame3) # Nevada와 Ohio가 칼럼, 2000/2001/2002가 로우가 됨
frame3.T
를 이용해 전치 가능 (로우와 컬럼이 뒤집어짐)- 직접 색인 지정 가능 :
pd.DataFrame(pop, index=[2001, 2002, 2003])
색인 객체(Index Objects)
- Pandas 인덱스 객체는 테이블 형식의 데이터에서, 각 축에 대한 레이블과 메타 데이터를 다룸
- Series, Data Frame 객체 생성할 때 배열이네 레이블의 순서가 내부적으로 인덱스로 변환됨
- 파이썬의 사전과 달리 중복되는 인덱스 값을 허용함
def PandasIndexes():
# 인덱스 객체
obj = pd.Series(range(3), index=['a', 'b', 'c'])
print(obj, obj.index)
# 인덱스, 칼럼 포함 여부 확인
print('a' in obj.columns) # True
print(3 in obj.index) # False
2. 핵심 기능
- Series나 DataFrame에 저장된 데이터를 다루는 핵심적인 기능을 살펴보자.
재색인
reindex()
: 새로 재배치한 인덱스에 맞게 데이터을 재배열하고, 존재하지 않는 새로운 색인값에 대홰서는 NaN으로 채운다.
obj2 = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
print(obj2)
# 재색인(Reindex) : 인덱스의 배열을 변경 (없던 인덱스 추가 시 NaN 추가)
obj3 = obj2.reindex(['a', 'b', 'c', 'd', 'e'])
print(obj3)
method=ffill
옵션 추가 : 누락된 값을 직전의 값으로 채워넣음- 시계열 같은 순차적인 데이터를 재색인할 때 값을 보간하거나 채워 넣어야 하는 경우에 사용됨
obj = pd.Series(['blue', 'purple', 'yellow'], index=[0,2,4])
obj4 = obj.reindex(range(6), method='ffill') # index=1 은 0의 값으로, 3은 2의 값으로, 5는 4의 값으로 채움
print(obj4)
- 재색인은 로우(색인), 컬럼 둘다 변경 가능 (재배치 기능)
columns
예약어를 통해 칼럼 재색인 가능
frame = pd.DataFrame(np.arange(9).reshape(3,3),
index=['a','b','c'],
columns=['Ohio', 'Texas', 'California'])
print(frame)
frame2 = frame.reindex(['a', 'b', 'c', 'd']) # d 칼럼 추가
print(frame2)
# columns 키워드를 사용해 DataFrame 컬럼 재색인 가능
states = ['Texas','Utah','California'] # Ohio 컬럼은 제외, Utah를 새로 생성
frame2 = frame.reindex(columns=states) # Utah에 대해서는 NaN으로 채움
print(frame2)
- 재색인은 loc을 이용해 라벨로 색인하면 좀 더 간결하게 할 수 있다.
frame.loc[['a', 'b', 'c', 'd'], states]
엔트리 삭제 (Dropping entries from an axis)
- 로우나 컬럼을 쉽게 삭제할 수 있다. 이는 데이터의 모양을 변경하는 작업을 진행한다.
drop
메소드를 통해 축으로부터 지정된 값(칼럼)을 삭제한 새로운 객체 리턴- 크기 또는 형태를 변경하는 함수는 새로운 객체 반환 대신 원본 객체를 변경한다.
def DroppingEntries():
obj = pd.Series(np.arange(5.), index=['a','b','c','d','e'])
print(obj)
new = obj.drop('c') # C 로우 삭제 (해당 로우의 데이터 모두 삭제)
print(new)
new = obj.drop(['d','c']) # 동시에 여러 로우 삭제
print(new)
data = pd.DataFrame(np.arange(16).reshape((4,4)),
index=['Ohio','Colorado','Utah','New York'],
columns=['one','two','three','four'])
print(data)
d1 = data.drop(['Colorado', 'Ohio'])
print(d1)
- 컬럼의 값을 삭제할 때에는
axis=1
또는axis='columns'
를 인자로 넘겨주면 된다.
728x90
반응형
'# Language & Tools > Python' 카테고리의 다른 글
Comments