Python / / 2022. 9. 23. 17:07

Python - Pandas DataFrame

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

'''
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유