데이터 처리 프로그래밍
2008년 금융 데이터 분석용으로 처음 개발
오픈소스=무료
통계, 데이터 과학, 머신러닝 분야에서 중요하게 사용
코랩으로 실습하기 때문에 설치가 따로 필요없음
설치: pip install pandas
엡데이트 관련 질문이 나오면 y Y
숫자 해석 라이브러리
선형대수 연산에 필요한 다차원 배열, 배열 연산 등
설치: pip install numpoy
기본 제공 시각화 도구
판다스와 연계하여 데이터를 다양한 방식으로 시각화
설치: pip install matplotlib
과학용 연산과 관련된 패키지 모음
미적분, 행열 연산, 선형 대수, 방정식 계산
설치: pip install scipy
머신러닝 학습을 위한 라이브러리
회귀, 분휴, 군집 등 대부분의 머신러닝 모형 제공
설치: pip install scikit-learn
수집 및 전처리 50~80%
알고리즘 선택, 모델링 결과 분석하여 유용한 정보 추출 20~50%>>이미 만들어진거 갖다쓰면 끝나
도메인 분야나 상황에 따라 다름
데이터 과학자가 하는 가장 기초적이고 중요한 일: 데이터 수집과 분석이 가능한 형태로 정리하는 것
판다스:
1. 데이터 수집, 정리에 최적화된 도구
2. 파이썬 기반 배우기 쉬움
3.데이터 과학의 80~90% 업무 처리 가능
시리즈, 데이터 프래임을 클래스
공통된 자료구조를 갖기 위해, 그래야 처리하기 편함!
#라이브러리 불러오기
import pandas as pd
#딕셔너리 생성 = 키와 값으로 구성
test_dict = {
'a': 1,
'b': 2,
'c': 3
}
print(test_dict)
----------
{'a': 1, 'b': 2, 'c': 3}
#딕셔너리를 시리즈로 변환
sr = pd.Series(test_dict)
print(sr)
#여러개 나왔다!> series!
#시리즈의 값은 정수 int
----------
a 1
b 2
c 3
dtype: int64
print(type(sr))
---------
<class 'pandas.core.series.Series'>
딕셔너리
{키: 값}
{열 이름: 값}
딕셔너리를 시리즈로 바꿀 수 있다
딕셔너리의 키 = 시리즈의 인덱스
import pandas as pd, #pd는 판다스의 별칭
pd.Series
인덱스 구조
원소의 순서와 주소를 저장
인덱스를 이용하여 데이터 값의 탐색, 정렬, 선택, 결합 등 데이터 조작을 쉽게 할 수 있음
인덱스:
원소 선택
인덱스 이용하여 선택
하나/여러 개의 원소를 한꺼번에 선택 가능
범위 지정
-정수형 위치 인덱스: [숫자], 제로 인덱스 (시작 번호=0)
-인덱스 이름/라벨:['이름']
# 이름 = 인덱스 이름/ 라벨
test_dict = {
'a': 1,
'b': 2,
'c': 3
}
sr = pd.Series(test_dict)
# 인덱스 확인
print(sr.index)
# object> 문자, 판다에서 사용. character
# 데이터 타입이 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,1,2,3)
---------------
0 Hello
1 23
2 3.14
3 True
dtype: object
# 인덱스 확인
print(sr.index)
# 값 확인
print(sr.values)
# Range 0,1,2,3/ 0부터 시작, 끝번호 포함 안해!!
# 리스트의 인덱스 => 인덱스 숫자
# 리스트의 요소 => 값 = 기본자료형
--------------
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:4]) #키, 체중, 불꽃남자
print(sr[1:3+1]) #키, 체중, 불꽃남자
#이름
print(sr['이름':'키']) #이름, 키
print(sr['키':'불꽃남자']) #키, 체중, 불꽃남자
---------------
이름 정대만
키 184
dtype: object
이름 정대만
키 184
dtype: object
키 184
체중 73.5
불꽃남자 True
dtype: object
키 184
체중 73.5
불꽃남자 True
dtype: object
이름 정대만
키 184
dtype: object
키 184
체중 73.5
불꽃남자 True
dtype: object
2차원 배열의 형태
행과 열로 구성
시리즈: 하나의 열, 데이터 프레임은 열이 여러 개,데이터 타입 주의
열은 공통의 속성을 갖는 일련의 데이터,
'공통의 속성'; 데이터 타입, 주소: 문자/ 나이:숫자
하나의 행 = 한 명의 학생
Data Frame ()
R data frame
원소 선택 : 행+ 열
원소 값 변경 원소 선택 = 행과 열 선택
# 라이브러리 불러오기
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)
# 딕셔너리의 키 = 데이터 프레임의 열 이름으로 사용
# 딕셔너리의 값 = 데이처 프레임의 열 값
# 딕셔너리의 값 = 리스트 요소 개수 = 행 인덱스
---------------
|| c1| c2| c3| c4
|----|:---|:----|:----:|----:
|0 | 1| 4| 7| 10
|1 | 2 | 5 | 8 | 11
|2| 3 | 6 | 9 | 12
<class 'pandas.core.frame.DataFrame'>
# 행 인덱스와 열 이름 설정하여 데이터 프레임 생성
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) # 변경 후
#원본을 변경하기 위해서는 inplace를 써야해
---------------
성명 연령 신장
학생1 정대만 19 184
학생2 서태웅 17 187
성명 연령 신장
선수1 정대만 19 184
선수2 서태웅 17 187
df_new = df.rename(columns = {'성명': '이름',
'연령': '나이',
'신장': '키'})
print(df)
print(df_new)
-----------------
성명 연령 신장
선수1 정대만 19 184
선수2 서태웅 17 187
이름 나이 키
선수1 정대만 19 184
선수2 서태웅 17 187
# 원본을 바로 변경
print(df) # 변경 전
df.rename(columns = {'성명': '이름',
'연령': '나이',
'신장': '키'}, inplace = True )
print(df) # 변경 후
#원본을 변경하기 위해서는 inplace를 써야해
------------------
성명 연령 신장
선수1 정대만 19 184
선수2 서태웅 17 187
이름 나이 키
선수1 정대만 19 184
선수2 서태웅 17 187
#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 메소드 함수 반환 결과는 새로운 데이터 프레임
# 행 삭제 => axis = 0
print(df1) # 변경 전
df2=df1.drop('강백호', axis = 0)
print(df2) # 변경 후 = 새로운 데이터 프레임
--------------
point3 point2 ft
정대만 24 6 3
강백호 3 4 1
서태웅 9 18 6
point3 point2 ft
정대만 24 6 3
서태웅 9 18 6
print(df1) # 변경 전
df2=df1.drop('강백호', axis = 0, inplace = True)
print(df1) # 변경 후 = df1
------------------
point3 point2 ft
정대만 24 6 3
강백호 3 4 1
서태웅 9 18 6
point3 point2 ft
정대만 24 6 3
서태웅 9 18 6
<ipython-input-31-f5173f1e29bb>:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df2=df1.drop('강백호', axis = 0, inplace = True)