- 판다스 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
- 행 선택
- 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
- 인덱스 활용
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)
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