0525 pandas(1)

So hee Jeon·2023년 5월 29일

pandas

목록 보기
5/6
post-thumbnail

데이터 처리 프로그래밍

intro) 데이터 분석 관련 필수 라이브러리

1. 판다스 pandas

2008년 금융 데이터 분석용으로 처음 개발
오픈소스=무료
통계, 데이터 과학, 머신러닝 분야에서 중요하게 사용
코랩으로 실습하기 때문에 설치가 따로 필요없음
설치: pip install pandas
엡데이트 관련 질문이 나오면 y Y

2. 넘파이 numpy

숫자 해석 라이브러리
선형대수 연산에 필요한 다차원 배열, 배열 연산 등
설치: pip install numpoy

3. 맷플롯립 matplotlib

기본 제공 시각화 도구
판다스와 연계하여 데이터를 다양한 방식으로 시각화
설치: pip install matplotlib

4. 사이파이 scipy

과학용 연산과 관련된 패키지 모음
미적분, 행열 연산, 선형 대수, 방정식 계산
설치: pip install scipy

5. 사이킷런 scikit-learn

머신러닝 학습을 위한 라이브러리
회귀, 분휴, 군집 등 대부분의 머신러닝 모형 제공
설치: pip install scikit-learn

데이터 분석에서 차지하는 비중

수집 및 전처리 50~80%
알고리즘 선택, 모델링 결과 분석하여 유용한 정보 추출 20~50%>>이미 만들어진거 갖다쓰면 끝나
도메인 분야나 상황에 따라 다름

데이터 과학자가 하는 가장 기초적이고 중요한 일: 데이터 수집과 분석이 가능한 형태로 정리하는 것

판다스:
1. 데이터 수집, 정리에 최적화된 도구
2. 파이썬 기반 배우기 쉬움
3.데이터 과학의 80~90% 업무 처리 가능

2.1. 판다스 자료 구조

시리즈, 데이터 프래임을 클래스
공통된 자료구조를 갖기 위해, 그래야 처리하기 편함!

시리즈: 하나의 열

#라이브러리 불러오기
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)
profile
!굉장나 엄청해!

0개의 댓글