import numpy as np
import pandas as pd
'''
판다스(PANDAS): 파이썬의 데이터 분석 라이브러리
(단, 정형데이터 2차원을 다룰 경우)
-데이터테이블을 다루는 도구
기본적으로 넘파이를 사용
-넘파이 : 파이썬에서 배열을 다루는 최적의 라이브러리
-판다스는 넘파이를 효율적으로 사용하기 위해 인덱싱, 연산 ,전처리등 다양한 함수 제공
데이터프레임 : 데이터 테이블 전체 객체
시리즈 : 각 열 데이터를 다루는 객체 (데이터프레임 중 하나의 열에 해당하는 데이터의 모음 객체)
시리즈 객체 : 피쳐 벡터와 같은 개념
-일반적으로 하나의 피쳐 데이터를 포함하는 형태
-생성된 데이터프레임 안에 포함될 수 있음
-list,dict, ndarray등 다양한 데이터 타입이 시리즈 객체 형태로 변환 되기도함
<시리즈 객체>
시리즈 객체를 생성하면 세가지 요소 생성
-데이터 : 기존 다른 객체처럼 값을 저장하는 요소
-인덱스 : 항상 0부터 시작하고, 숫자로만 할당하는값
1)시리즈 객체에서는 숫자,문자열,0외의 값으로 시작하는 숫자,순서가 일정하지 않은 숫자를 입력할 수 있음.
2)시리즈 객체에서는 인덱스 값의 중복을 허용
데이터 타입 : 넘파이의 데이터 타입과 일치
-판다스는 넘파이의 래퍼 라이브러리
-넘파이의 모든 기능을 지원하고 데이터 타입도 그대로 적용
''''''
----------------------------------------------------------------------------
< 시리즈 객체 생성하기 >
-데이터프레임 객체를 먼저 생성하고 각 열에서 시리즈 객체를 뽑는것이 일반적인 방법
PanDas 모듈 호출
import pandas as pd #넘파이를 호출하지 않아도 판다스안에 넘파이가 들어가있다.
리스트 --> 시리즈
list_data = [1,2,3,4,5]
example_obj = pd.Series(list_data)
example_obj
----------------------------------------------------------------------------
'''
list_data = [1,2,3,4,5]
example_obj = pd.Series(list_data)
print(example_obj)
'''
<시리즈 객체 >
-판다스의 모든 객체는 인덱스 값을 기준으로 생성
-리스트 > 시리즈(인덱스 지정)
'''
list_name =["a","b","c","d","e"]
example_obj = pd.Series(data=list_data,index =list_name)
print(example_obj)
'''
기존 데이터에 인덱스 값을 추가하면 NaN 값이 출력됨'''
dict_data_1= {"a":1,"b":2,"c":3,"d":4,"e":5}
#f,g,h 값이 없다.
indexes =["a","b","c","d","e","f","g","h"]
#따라서 인덱스 값을 추가 할 경우, f ,g h는 NaN으로 표기 된다.
#인덱스 값을 추가하지 않을 경우, e까지만 출력된다.
series_obj_1= pd.Series(dict_data_1,index=indexes)
print(series_obj_1)
'''---------------------------------------------------------
다양한 시퀀스형 데이터 타입으로 저장 가능
'''
dict_data = {"a":1,"b":2,"c":3,"d":4,"e":5}
#float타입으로 저장
example_obj = pd.Series(dict_data,dtype= np.float32)
print(example_obj)
#시리즈 객체 이름 지정하여 저장 가능
example_obj = pd.Series(dict_data,dtype= np.float32, name ="example_data")
#출력 : Name: example_data, dtype: float32
print(example_obj)
'''
시리즈의 values
--> example_obj.values
출력 : [1. 2. 3. 4. 5.]
시리즈의 인덱스
--> example_obj.index
출력 : Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
시리즈의 데이터 타입
-->example_obj.dtype
출력 : float32
시리즈의 values의 타입
-->type(example_obj3.values)
출력: <class 'numpy.ndarray'>
------------------------------------------------------------
''''''
시리즈 객체는 객체의 이름을 변경할 수 있음
열의 이름을 지정해주는 방식
인덱스 이름도 추가로 지정 가능
[실습]
'''
example_obj.name ="number"
example_obj.index.name ="id"
print(example_obj)
''' 출력:
id
a 1.0
b 2.0
c 3.0
d 4.0
e 5.0
Name: number, dtype: float32
'''
#series_obj_1의 1번째 원소 선택 (정수형 인덱스 활용)
print(series_obj_1[0])
#b라벨을 가진 원소를 선택 (인덱스 이름 활용 )
print(series_obj_1['b'])
#c와 e의 원소를 선택 (인덱스 리스트 활용)
print(series_obj_1[['c','e']])
#b에서 d까지의 원소 선택(인덱스 범위 지정)
print(series_obj_1['b':'d'])
'''-----------------------------------------------
<데이터 프레임 객체>
-데이터 테이블 전체를 지칭하는 객체
-넘파이 배열의 특성을 그대로 가짐
-인덱싱 :열과 행 각각 사용하여 하나의 데이터에 접근
--------------------------------------------------
''''''
<데이터프레임을 직접 생성>
-딕셔너리 타입 데이터에서 키(key)는 열 이름, 값(value)은 시퀀스형 데이터 타입을 넣어 각 열의 데이터로 만듦
'''
dict_data ={'이름':['준서','예은'],
'나이':[15,17],
'성별':['남','여'],
'학교':['덕영중','수리중']}
dt = pd.DataFrame(data =dict_data)
print(dt)
'''
--------------------------------------------------
[실습]
'''
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data,columns=['first_name','last_name','age','city'])
#행인덱스
df.index
#열이름
df.columns
print(df)
print(df.index) # RangeIndex(start=0, stop=5, step=1)
print(df.columns) # Index(['first_name', 'last_name', 'age', 'city'], dtype='object')
#컬럼 가져오기
#출력:age
print(df.columns[2])
'''데이터 생성시, 열 이름을 한정하면 해당 열만 추출
'''
#컬럼 지정해서 뽑아오기
print(pd.DataFrame(raw_data,columns = ["age","city"]))
'''출력:
age city
0 42 San Francisco
1 52 Baltimore
2 36 Miami
3 24 Douglas
4 73 Boston
''''''
[데이터가 존재하지 않는 열을 추가하면 해당 열에는 NaN 값들 추가]
'''
print(pd.DataFrame(raw_data,columns =["first_name","last_name","age","city","debt"]))
'''출력:
first_name last_name age city debt
0 Jason Miller 42 San Francisco NaN
1 Molly Jacobson 52 Baltimore NaN
2 Tina Ali 36 Miami NaN
3 Jake Milner 24 Douglas NaN
4 Amy Cooze 73 Boston NaN
''''''
[행 인덱스, 열 이름 변경하기]
'''
#컬럼을 바꿔도, 위치가 실제로 바뀌는게 아니다 ! !
df = pd.DataFrame(raw_data,columns=['last_name','first_name','age','city'])
df.index=['student1','student2','student3','student4','student5']
df.columns = ['이름','성','나이','지역']
#데이터 프레임
print(df)
#행 인덱스
print(df.index) # Index(['student1', 'student2', 'student3', 'student4', 'student5'], dtype='object')
#열 이름
print(df.columns) # Index(['이름', '성', '나이', '지역'], dtype='object')
'''-----------------------------------------------------------------------
[행 인덱스, 열 이름 변경하기 - 2 ]
'''
#열 이름중, '나이'를 '연령'으로, '지역'을 '도시'로, '성'을 'ln'으로 바꾸기
df.rename(columns={'나이':'연령','지역':'도시','성':'ln','이름':'fn'},inplace = True)
# df의 행 인덱스 중에서, 'student1'을 '학생1'로 바꾸기 ,
# 만약 inplace를 False를 원본이 바뀌지 않는다.
# True를 할 경우, 원본값이 변경된다.
# inplace를 하기전, 인덱스까지만 찍어보고 결과값이 내가 원하는 결과로 바뀔 경우에만 inplace = True로 한다.
df.rename(index={'student1':'학생1','student2':'학생2'},inplace=True)
print(df)
'''출력:
fn ln 연령 도시
student1 Miller Jason 42 San Francisco
학생2 Jacobson Molly 52 Baltimore
student3 Ali Tina 36 Miami
student4 Milner Jake 24 Douglas
student5 Cooze Amy 73 Boston
'''