데이터 조작 및 분석을 위해 Python 프로그래밍 언어로 작성된 소프트웨어 라이브러리로,
3가지 객체(series
,dataframe
,index
) 를 가진다.
index와 값으로 구성되어 있으며,
index
속성으로 접근이 가능하다.
- 벡터와 대응
- 1차원 배열
series는 다음과 같이 두가지 방법으로 만들 수 있다.
# 방법 1 (배열)
import pandas as pd
data1 = pd.Series([0.25, 0.5, 0.75, 1.0], index = ['a', 'b', 'c', 'd'])
data2 = pd.Series([0.25, 0.5, 0.75, 1.0], index = [2, 3, 5, 7])
# 방법 2 (dictionary) - key가 index 역할
price_dict = {'apple': 20000,
'banana': 10000,
'pineapple': 9000,
'strawberry': 9000,
'cherry': 17000}
price = pd.Series(price_dict)
머신러닝 모델 학습을 위한 학습 데이터의 기본적인 데이터 구조로,
인덱스
와열이름
을 가지는 2차원 배열이라고 볼 수 있다.
- 여러개의 series로 구성
- 행렬과 대응
- 다차원 배열
- 행 = record = instance
- 열 = 특징 = 속성 = column
dataframe은 다음과 같이 세가지 방법으로 만들 수 있다.
# 방법 1) pd.DataFrame(series, columns)
data = [{'a': i, 'b': 2*i} for i in range(3)]
pd.DataFrame(data)
# 여러 series의 결합 (방법1)
validity_dict = {'apple': '2021-11-30',
'banana': '2021-10-30',
'pineapple': '2021-10-20',
'strawberry': '2021-10-21',
'cherry': '2021-10-22',}
validity = pd.Series(validity_dict)
fruit = pd.DataFrame({'price': price, 'validity': validity})
fruit
# 방법 2) pd.DataFrame(dictionary list)
data = [{'a': 1, 'b':2}, {'b': 3, 'c':4}]
pd.DataFrame(data)
# 방법 3) pd.DataFrame(numpy array, columns, index)
import numpy as np
pd.DataFrame(np.random.rand(3,2),
columns =['foo', 'bar'],
index = ['a', 'b', 'c'])
- 불변의 배열(요소의 추가, 수정 및 삭제가 불가능한 배열)이나 정렬된 집합과 같이 작동
- 배열에서 제공하는 인덱싱, 슬라이승 가능
ind = pd.Index([2,3,5,7,11])
ind[1] # 인덱싱
ind[::2] # 슬라이싱
ind[1] = 0 # Type error 발생 (요소 변경 불가)
indA = pd.Index([1,3,5,7,9])
indB = pd.Index([2,3,5,7,11])
indA & indB # 집합 연산 가능 (교집합)
indA | indB # 집합 연산 가능 (합집합)
# key를 이용한 데이터 인덱싱
data = pd.Series([0.25, 0.5, 0.75, 1.0], index = ['a', 'b', 'c', 'd'])
'a' in data # 'a'가 data에 들어있는지 확인
data.keys() # data의 key(index) 가져오기
list(data.items()) # data의 key-value 가져오기 (data.items() x)
data['e'] = 1.25 # 값 추가
data['d'] = 9.9999 # 값 치환
# key를 이용한 데이터 슬라이싱
data['a':'c'] # explicit한 인덱스 사용
data[0:3] # implicit한 인덱스 사용
data[(data>0.3) & (data<0.8)]
data[['a', 'e']] # 팬시 인덱싱
loc
indexer (location based indexer): 명시적인 인덱스(index 객체의 값을 활용)iloc
indexer (integer-location based indexer): 암묵적인 인덱스(index 객체의 값과 무관한 record의 순서)를 활용한 인덱서- DataFrame은
키
or속성
로 접근 가능
1.data['column']
ex) data['price'] (추천방식)
2.data.column
ex) data.price- 인덱싱은 열을 참조, 슬라이싱은 행을 참조
area = pd.Series([423967, 170312, 149995, 141297, 695662],
index = ['California', 'Florida', 'Illinois', 'New York', 'Texas'])
pop = pd.Series([38332521, 19552860, 12882135, 19651127, 26448193],
index = ['California', 'Florida', 'Illinois', 'New York', 'Texas'])
df = pd.DataFrame({'area':area, 'pop':pop})
df['density'] = df['pop']/df['area']
df
# 행단위 인덱싱을 할 때는 인덱서를 꼭 사용해야함.
df['California'] # 잘못된 방식
df.loc['California'] # 올바른 방식
df.iloc[0]
# 팬시 인덱싱
ind1 = ['Florida', 'Texas']
df.loc[ind1]
df.iloc[[1,4]]
# 열단위 인덱싱은 인덱서를 활용하지 않고 특징 이름을 활용.
df.loc['pop'] # 잘못된 방식
df['pop'] # 올바른 방식
type(df['pop']) # 결과는 series
# 팬시 인덱싱
ind2 = ['pop', 'area']
df[ind2]
df.loc['Florida':'Texas']
df['Florida':'Texas'] # 인덱서 생략가능
# dataframe의 column 인덱스 객체를 활용
df[df.columns[1:]]
# dataframe의 암묵적 idnex를 활용
df.iloc[:,1:]
# 팬시 인덱싱
ind4 = df['density']>=100
df[ind4]
ind5 = df['area']>=150000
df[ind4 & ind5]
- sum(), max(), mun() 등의 집계 연산을 해도 오류가 발생하지 않음
- float64 type
- sum(), max(), mun() 등의 집계 연산 시 오류 발생
isnull()
: 누락 값을 가리키는 bool mask 생성
notnull()
: isnull()
의 반대인 bool mask 생성
dropna()
: 누락 값을 제거한 데이터 반환
df.dropna(axis=0) # nan을 포함하는 행을 삭제
df.dropna(axis=1) # nan을 포함하는 열을 삭제
fillna(x)
: 누락 값을 x로 채운 데이터 사본을 반환
df.fillna(method = 'ffill') # 이전값으로 채우기
df.fillna(method = 'bfill') # 다음값으로 채우기
drop_duplicates()
: Pandas 데이터프레임에 포함된 중복 데이터 확인 및 처리를 위한 메서드
drop_duplicates(subset = None,
keep = ‘first’,
inplace = False,
ignore_index = False)
df[df.duplicated(keep = False)] # 중복 데이터 '확인'
df.drop_duplicates() # 중복 데이터 '삭제'
df.drop_duplicates(subset = [‘brand’]) # brand특징 중복 데이터 삭제
pd.concat([df1, df2])
- series 또는 dataframe을 결합하는데 사용
- default: 행 단위 결합 (수직)
np.concatenate()
과 달리 인덱스가 유지 됨
=> 해결 방법 :pd.concat([df1, df2], ignore_index=True)
- 키 열 이름이 같은 경우:
on
키워드 사용pd.merge(df1, df2, on = ['employee'])
- 키 열 이름이 다른 경우:
left_on & right_on
키워드 사용# employee(=name) 으로 결합 pd.merge(df1, df3, left_on = 'employee', right_on='name')
- 인덱스 이름이 같은 경우:
left_index & right_index
키워드 사용pd.merge(df1, df3, left_index=True, right_index=True)