- 데이터 분석 관련 필수 라이브러리
- 판다스 pandas오픈소스 = 무료코랩으로 실습하기 때문에 설치가 따로 필요없음업데이트 관련 질문이 나오면 y Y
- 설치 : pip install pandas
- 통계, 데이터 과학, 머신러닝 분야에서 중요하게 사용
- 2008년 금융 데이터 분석용으로 처음 개발
- 넘파이 numpy선형 대수 연산에 필요한 다차원 배열, 배열 연산 등
- 설치 : pip install numpy
- 숫자 해석 라이브러리
- 맷플롯립 matplotlib판다스와 연계하여 데이터를 다양한 방식으로 시각화
- 설치 : pip install matplotlib
- 기본 제공 시각화 도구
- 사이파이 scipy미적분, 행열 연산, 선형 대수, 방정식 계산 등의 함수 제공
- 설치 : pip install scipy
- 과학용 연산과 관련된 패키지 모음
- 사이킷런 scikit-learn회귀, 분류, 군집 등 대부분의 머신러닝 모형
- 설치 : pip install scikit-learn 시
- 머신러닝 학습을 위한 라이브러리
시리즈
- 데이터가 순차적으로 나열된 1차원 배열의 형태
- 딕셔너리와 구조가 비슷함
- 딕셔너리를 시리즈로 변환 많이 함
- 판다스 내장함수 Series( ) 이용
- 딕셔너리를 함수의 매개변수로 전달
- 딕셔너리의 키 = 시리즈의 인덱스
- 딕셔너리의 값 = 시리즈의 값(원소)
- 시리즈 만들기
# 라이브러리 불러오기
import pandas as pd
# 딕셔너리 생성
test_dict = {
'a' : 1,
'b' : 2,
'c' : 3
}
test_dict
------------------------------------------------------
{'a': 1, 'b': 2, 'c': 3}
# 딕셔너리를 시리즈로 변환
sr = pd.Series(test_dict)
print(sr)
# 시리즈의 값은 정수 int
------------------------------------------------------
a 1
b 2
c 3
dtype: int64
# 시리즈 객체 확인
print(type(sr))
------------------------------------------------------
<class 'pandas.core.series.Series'>
- 인덱스 구조
- 원소의 순서와 주소를 저장
- 인덱스를 이용하여 데이터 값의 탐색, 정렬, 선택, 결합 등 데이터 조작 쉽게 가능
- 정수형 인덱스 ex) df[3], 제로인덱스 사용
- 인덱스 이름 및 라벨 ex) df[’이름’]
# 이름 = 인덱스 이름 / 라벨 test_dict = { 'a' : 1, 'b' : 2, 'c' : 3 } sr = pd.Series(test_dict) # 인덱스 확인 print(sr.index) # 데이터 타입이 object = 문자 # 인덱스 이름 = a, b, c ------------------------------------------------------ Index(['a', 'b', 'c'], dtype='object') # 값 확인 print(sr.values) # 딕셔너리의 키 => 인덱스 이름 # 딕셔너리의 값 => 값 = 숫자 int ------------------------------------------------------ [1 2 3] # 숫자 = 정수형 위치 인덱스 # 리스트 생성 # 기본자료형 = 문자열, 숫자, 불 test_list = ["Hello", 23, 3.14, True] print(test_list) ------------------------------------------------------ ['Hello', 23, 3.14, True] # 리스트를 시리즈로 변환 sr = pd.Series(test_list) print(sr) ------------------------------------------------------ 0 Hello 1 23 2 3.14 3 True dtype: object # 인덱스 확인 print(sr.index) # 값 확인 print(sr.values) # 리스트의 인덱스 => 인덱스 숫자 # 리스트의 요소 => 깂 = 기본자료형 ------------------------------------------------------ RangeIndex(start=0, stop=4, step=1) ['Hello' 23 3.14 True]
- 원소 선택
# 인덱스 사용 # 튜플 생성 # 리스트와 유사 # 차이점 : 소괄호 사용, 원소(개별 값) 변경 불가 # 기본자료형 test_tuple = ("정대만", 184, 73.5, True) print(test_tuple) ------------------------------------------------------ ('정대만', 184, 73.5, True) # 튜플을 시리즈로 변환 sr = pd.Series(test_tuple, index = ['이름', '키', '체중', '불꽃남자']) print(sr) ------------------------------------------------------ 이름 정대만 키 184 체중 73.5 불꽃남자 True dtype: object # 하나의 원소 선택 # 숫자 print(sr[0]) # 이름 print(sr[1]) # 키 print(sr[2]) # 체중 print(sr[3]) # 불꽃남자 ------------------------------------------------------ 정대만 184 73.5 True # 이름 print(sr['이름']) # 이름 print(sr['키']) # 키 print(sr['체중']) # 체중 print(sr['불꽃남자']) # 불꽃남자 ------------------------------------------------------ 정대만 184 73.5 True # 여러 개의 원소 선택 # 숫자 print(sr[[0, 3]]) # 이름, 불꽃남자 print(sr[[1, 3]]) # 키, 불꽃남자 # 이름 print(sr[['이름', '체중']]) # 이름, 체중 print(sr[['키','불꽃남자']]) # 키, 불꽃남자 ------------------------------------------------------ 이름 정대만 불꽃남자 True dtype: object 키 184 불꽃남자 True dtype: object 이름 정대만 체중 73.5 dtype: object 키 184 불꽃남자 True dtype: object # 범위를 지정하여 여러 개의 원소 선택 = 슬라이싱 # 숫자 = 끝 번호를 포함하지 않음 print(sr[0 : 2]) # 이름, 키 print(sr[0 : 1+1]) # 이름, 키 print(sr[1 : 2]) # 키, 체중, 불꽃남자 print(sr[1 : 3+1]) # 키, 체중, 불꽃남자 # 이름 print(sr['이름' : '키']) # 이름, 키 print(sr['키' : '불꽃남자']) # 키, 체중, 불꽃남자 ------------------------------------------------------ 이름 정대만 키 184 dtype: object 이름 정대만 키 184 dtype: object 키 184 dtype: object 키 184 체중 73.5 불꽃남자 True dtype: object 이름 정대만 키 184 dtype: object 키 184 체중 73.5 불꽃남자 True dtype: object
데이터프레임
- 2차원 배열의 형태(행과 열로 구성)
- 행은 개별 관측 대상에 대한 다양한 속성 데이터들의 모임 ⇒ 레코드. 케이스 등
- 열은 공통의 속성을 갖는 일련의 데이터
- 하나의 열은 시리즈 객체 = 열 벡터
- 데이터 프레임은 여러 개의 행과 열을 가질 수 있는 2차원 벡터 = 행렬
- 인덱스의 종류
- 행 인덱스, 열 이름
- 데이터프레임 만들기
- 같은 길이의 여러 개의 열(시리즈) 집합
- 여러 개의 리스트를 가지는 딕셔너리를 함수에 전달
# 라이브러리 불러오기 import pandas as pd # 딕셔너리 = 키 & 여러 개의 값(리스트 형태) test_dict = { 'c1' : [1, 2, 3], 'c2' : [4, 5, 6], 'c3' : [7, 8, 9], 'c4' : [10, 11, 12] } print(test_dict) ------------------------------------------------------ {'c1': [1, 2, 3], 'c2': [4, 5, 6], 'c3': [7, 8, 9], 'c4': [10, 11, 12]} # 딕셔너리를 데이터프레임으로 변환 df = pd.DataFrame(test_dict) print(df) print(type(df)) # 딕셔너리의 키 = 데이터프레임의 열 이름 # 딕셔너리의 값 = 데이터프레임의 열 값 # 딕셔너리의 값 = 리스트의 요소 개수 = 행 인덱스 ------------------------------------------------------ c1 c2 c3 c4 0 1 4 7 10 1 2 5 8 11 2 3 6 9 12 <class 'pandas.core.frame.DataFrame'>
- 행 인덱스 / 열 이름 설정
- 사용자가 지정 가능
- rename 메소드를 이용하면 행 인덱스 / 열 이름 일부 선택하여 변경 가능
# 행 인덱스와 열 이름 설정하여 데이터프레임 생성 df = pd.DataFrame([['정대만', 19, 184], ['서태웅', 17, 187]], index = ['선수1', '선수2'], # 행 인덱스 columns = ['이름', '나이', '키']) # 열 이름 print(df) ------------------------------------------------------ 이름 나이 키 선수1 정대만 19 184 선수2 서태웅 17 187 # 행 인덱스 확인 print(df.index) # 열 이름 확인 print(df.columns) ------------------------------------------------------ Index(['선수1', '선수2'], dtype='object') Index(['이름', '나이', '키'], dtype='object') # 행 인덱스, 열 이름 => 이름 변경 df.index = ['학생1', '학생2'] df.columns = ['성명', '연령', '신장'] print(df) ------------------------------------------------------ 성명 연령 신장 학생1 정대만 19 184 학생2 서태웅 17 187 # 메소드 함수 = 클래스 안에 있는 함수 # 행 인덱스, 열 이름 => 이름 변경 # rename 메소드 함수의 반환값은 새로운 데이터프레임 df_new = df.rename(index = {'학생1' : '선수1', '학생2' : '선수2'}) # 데이터 프레임 print(df) print(df_new) ------------------------------------------------------ 성명 연령 신장 학생1 정대만 19 184 학생2 서태웅 17 187 성명 연령 신장 선수1 정대만 19 184 선수2 서태웅 17 187 # 원본을 바로 변경 print(df) # 변경 전 df.rename(index = {'학생1' : '선수1', '학생2' : '선수2'}, inplace = True) print(df) # 변경 후 ------------------------------------------------------ 성명 연령 신장 학생1 정대만 19 184 학생2 서태웅 17 187 성명 연령 신장 선수1 정대만 19 184 선수2 서태웅 17 187
- 행/열 삭제
- drop메소드에서
- 행 삭제 : axis = 0
- 열 삭제 : axis = 1
# drop 메소드 함수 반환 결과는 새로운 데이터프레임 score_dict = { 'point3' : [24, 3, 9], 'point2' : [6, 4, 18], 'ft' : [3, 1, 6] } print(score_dict) ------------------------------------------------------ {'point3': [24, 3, 9], 'point2': [6, 4, 18], 'ft': [3, 1, 6]} df = pd.DataFrame(score_dict, index = ['정대만', '강백호', '서태웅']) print(df) ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 df1 = df[:] print(df1) ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 # drop 메소드 함수 반환 결과는 새로운 데이터프레임 print(df1) # 변경 전 df1 = df1.drop('강백호', axis = 0) print(df1) # 변경 후 = df1 ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 ft 정대만 24 6 3 서태웅 9 18 6 # 사본 저장 df1 = df[:] # 열 삭제 = axis = 1 print(df1) # 변경 전 df2 = df1.drop('ft', axis = 1) print(df2) # 변경 후 = 새로운 데이터프레임 print(df1) # 변경 전 df1.drop('ft', axis = 1, inplace = True) print(df1) # 변경 후 = df1 # inplace = True를 지정하면 원본이 바뀜 # 그렇지 않으면 사본 생성됨 ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 정대만 24 6 강백호 3 4 서태웅 9 18 point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 정대만 24 6 강백호 3 4 서태웅 9 18
- drop메소드에서
- 행 선택
- loc 인덱스 이름으로 행 선택
- iloc 정수형 위치 인덱스 사용
# loc 인덱서 = 이름 print(df.loc['정대만']) # 시리즈 print(df.loc[['정대만']]) # 데이터프레임 ------------------------------------------------------ point3 24 point2 6 ft 3 Name: 정대만, dtype: int64 point3 point2 ft 정대만 24 6 3 # loc 인덱서 = 숫자 print(df.iloc[0]) # 시리즈 print(df.iloc[[0]]) # 데이터프레임 ------------------------------------------------------ point3 24 point2 6 ft 3 Name: 정대만, dtype: int64 point3 point2 ft 정대만 24 6 3 # 여러 개의 행 선택 print(df.loc[['정대만', '서태웅']]) # 데이터프레임 print(df.iloc[[0, 2]]) # 데이터프레임 ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 서태웅 9 18 6 point3 point2 ft 정대만 24 6 3 서태웅 9 18 6 # 여러 개의 행 선택 print(df.loc['정대만' : '서태웅']) # 데이터프레임 print(df.iloc[0 : 2]) # 데이터프레임 print(df.iloc[0 : 1 + 1]) # 데이터프레임 ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 ft 정대만 24 6 3 강백호 3 4 1 point3 point2 ft 정대만 24 6 3 강백호 3 4 1
- 열 선택
- df[’수학’]
- df.영어
- df[[’음악’, ‘체육’]]
# 열 선택하는 방법 3가지 # 열 하나 선택 print(df['point3']) # 시리즈 print(df[['point3']]) # 데이터프레임 print(df.point3) # 시리즈 # 여러 개의 열 선택 print(df[['point3', 'ft']]) # 데이터프레임 ------------------------------------------------------ 정대만 24 강백호 3 서태웅 9 Name: point3, dtype: int64 point3 정대만 24 강백호 3 서태웅 9 정대만 24 강백호 3 서태웅 9 Name: point3, dtype: int64 point3 ft 정대만 24 3 강백호 3 1 서태웅 9 6
- 원소 선택
- 인덱서 loc나 iloc 이용하여 행, 열 인덱스 입력
# 행과 열을 동시에 선택 print(df.loc['정대만', 'point3']) print(df.iloc[0, 0]) ------------------------------------------------------ 24 24 # 여러 개의 행과 하나의 열 선택 print(df.loc[['정대만', '서태웅'], 'point2']) print(df.iloc[[0, 2], 1]) ------------------------------------------------------ 정대만 6 서태웅 18 Name: point2, dtype: int64 정대만 6 서태웅 18 Name: point2, dtype: int64 # 하나의 행과 여러 개의 열 선택 print(df.loc['정대만',['point3', 'ft']]) print(df.iloc[0, [0, 2]]) ------------------------------------------------------ point3 24 ft 3 Name: 정대만, dtype: int64 point3 24 ft 3 Name: 정대만, dtype: int64 # 여러 개의 행과 여러 개의 열 선택 print(df.loc[['정대만', '서태웅'],['point3', 'ft']]) print(df.iloc[[0, 2], [0, 2]]) ------------------------------------------------------ point3 ft 정대만 24 3 서태웅 9 6 point3 ft 정대만 24 3 서태웅 9 6 # 여러 개의 행과 여러 개의 열 선택(슬라이싱) print(df.loc['정대만': '서태웅','point3' : 'ft']) print(df.iloc[0 : 3, 0 : 3]) print(df.iloc[0 : 2+1, 0 : 2+1]) ------------------------------------------------------ point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6 point3 point2 ft 정대만 24 6 3 강백호 3 4 1 서태웅 9 18 6
- 열 추가
# 다른 값을 가진 열 추가 = 리스트 형태
df['rebound'] = [1, 10, 5]
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
- 행 추가
# 다른 값을 가진 행 추가 = 리스트 형태
df.loc['송태섭'] = [9, 10, 6, 3, 0]
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
채치수 0 0 0 0 0
송태섭 9 10 6 3 0
- 원소값 변경
# 하나의 행과 하나의 열을 선택하여 값 변경
df.loc['채치수', 'rebound'] = 5
print(df)
df.iloc[4, 4] = 1
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
채치수 0 0 0 0 5
송태섭 9 10 6 3 0
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
채치수 0 0 0 0 5
송태섭 9 10 6 3 1
# 하나의 행과 여러 개의 열을 선택하여 값 변경
df.loc['채치수', ['point2', 'foul']] = 2
print(df)
df.iloc[3, [1, 3]] = 4
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
채치수 0 2 0 2 5
송태섭 0 0 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 2 10
서태웅 9 18 6 2 5
채치수 0 4 0 4 5
송태섭 0 0 6 3 1
# 여러 개의 행과 하나의 열을 선택하여 값 변경
df.loc[['강백호', '채치수'], 'rebound'] = 4
print(df)
df.iloc[[1, 3], 4] = 3
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 4
서태웅 9 18 1 1 1
채치수 6 4 1 4 4
송태섭 6 6 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 3
서태웅 9 18 1 1 1
채치수 6 4 1 4 3
송태섭 6 6 6 3 1
# 여러 개의 행과 여러 개의 열을 선택하여 값을 변경
df.loc[['채치수', '송태섭'], ['point3', 'point2']] = 0
print(df)
df.iloc[[3, 4], [0, 1]] = 6
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 1
서태웅 9 18 1 1 1
채치수 6 6 1 1 1
송태섭 6 6 6 3 1
df.iloc[1:4, 2:5] = 1
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 1
서태웅 9 18 1 1 1
채치수 6 6 1 1 1
송태섭 6 6 6 3 1
# 다른 값으로 변경
# 하나의 행과 여러 개의 열을 선택하여 값 변경
df.loc['채치수', ['point2', 'foul']] = [10, 4]
print(df)
# 대괄호 소괄호 생략해서 한 번에 할당
df.loc['채치수', ['point2', 'foul']] = 2, 1
print(df)
df.iloc[3, [1, 3]] = [4, 3]
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 1
서태웅 9 18 1 1 1
채치수 6 10 1 4 1
송태섭 6 6 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 1
서태웅 9 18 1 1 1
채치수 6 2 1 1 1
송태섭 6 6 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 1
서태웅 9 18 1 1 1
채치수 6 4 1 3 1
송태섭 6 6 6 3 1
# 여러 개의 행과 하나의 열을 선택하여 값 변경
df.loc[['강백호', '채치수'], 'rebound'] = [10, 5]
print(df)
df.iloc[[1, 3], 4] = [12, 7]
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 10
서태웅 9 18 1 1 1
채치수 6 4 1 4 5
송태섭 6 6 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 12
서태웅 9 18 1 1 1
채치수 6 4 1 4 7
송태섭 6 6 6 3 1
# 여러 개의 행과 여러 개의 열을 선택하여 값을 변경
df.loc[['채치수', '송태섭'], ['point3', 'point2']] = [[0, 8], [9, 8]]
print(df)
df.iloc[[3, 4], [0, 1]] = [[1, 4], [3, 2]]
print(df)
------------------------------------------------------
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 12
서태웅 9 18 1 1 1
채치수 0 8 1 4 7
송태섭 9 8 6 3 1
point3 point2 ft foul rebound
정대만 24 6 3 2 1
강백호 3 4 1 1 12
서태웅 9 18 1 1 1
채치수 1 4 1 4 7
송태섭 3 2 6 3 1
- 행과 열 위치 바꾸기
print(df.T)
------------------------------------------------------
정대만 강백호 서태웅 채치수 송태섭
point3 24 3 9 1 3
point2 6 4 18 4 2
ft 3 1 1 1 6
foul 2 1 1 4 3
rebound 1 12 1 7 1
print(df.transpose())
------------------------------------------------------
정대만 강백호 서태웅 채치수 송태섭
point3 24 3 9 1 3
point2 6 4 18 4 2
ft 3 1 1 1 6
foul 2 1 1 4 3
rebound 1 12 1 7 1
- 인덱스 활용
- 특정 열을 행 인덱스로 설정
- set_index
print(df) df_new = df.set_index('이름') print('--------------------------') print(df_new) ------------------------------------------------------ 이름 키 나이 득점 0 정대만 184 19 28 1 강백호 189 17 1 2 채치수 193 19 20 -------------------------- 키 나이 득점 이름 정대만 184 19 28 강백호 189 17 1 채치수 193 19 20
- 행 인덱스 재배열
- reindex
print(df) df_new = df.set_index('이름') print('--------------------------') print(df_new) # 원래 행 인덱스(정수)가 없어지고 이름 열이 행 인덱스가 됨 ------------------------------------------------------ 이름 키 나이 득점 0 정대만 184 19 28 1 강백호 189 17 1 2 채치수 193 19 20 -------------------------- 키 나이 득점 이름 정대만 184 19 28 강백호 189 17 1 채치수 193 19 20 print(df_new) df_new2 = df.set_index('키') print('--------------------------') print(df_new2) # 키 열이 행 인덱스가 되고, 행 인덱스였던 이름 열이 다시 열로 돌아옴 ------------------------------------------------------ 키 나이 득점 이름 정대만 184 19 28 강백호 189 17 1 채치수 193 19 20 -------------------------- 이름 나이 득점 키 184 정대만 19 28 189 강백호 17 1 193 채치수 19 20 # 여러 개의 열을 행 인덱스로 설정 print(df) df_new = df.set_index(['이름', '키']) print('--------------------------') print(df_new) ------------------------------------------------------ 이름 키 나이 득점 0 정대만 184 19 28 1 강백호 189 17 1 2 채치수 193 19 20 -------------------------- 나이 득점 이름 키 정대만 184 19 28 강백호 189 17 1 채치수 193 19 20
- 특정 열을 행 인덱스로 설정