자신에게 친절할 것 :)

Data Science/Pandas

[Pandas] numpy와 pandas 비교, pd.DataFrame(), header 변경

Tashapark 2024. 5. 20. 21:47
728x90
반응형

#코드잇 데이터 사이언스 강의 듣는 중

 

- 판다스는 기본적으로 넘파이를 바탕으로 만들어서 발전시킨 것

--> 외부 데이터 읽고 쓰기, 정리된 데이터 새로운 파일에 저장, 데이터 시각화 가능

--> 넘파이보다 표 형식을 다루는 것에 능함. 넘파이는 복잡한 수학 연산을 할 때 사용. 

 

- Pandas DataFrame: 2차원 형태의 데이터를 다루기 위한 자료형

- Pandas Series: 1차원 형태의 데이터를 다루기 위한 자료형 --> dataframe은 사실상 여러 개의 series로 구성된 것. 

- 열: column --> 데이터의 특징 

- 행: row/index --> 레코드 (각각에 대한 정보) 

 

Numpy Array Pandas DataFrame
- 인덱스 값(숫자)로 칼럼을 표현
- 2차원 넘파이 배열은 모든 값이 같은 자료형이어야 함 
- 칼럼에 변수 명 입력이 가능하고 그 값으로 찾을 수 있음. 
- 다양한 자료형을 한 번에 담을 수 있음. 

 

 

-  2차원 행렬은 행마다 []로 끊어서 입력하면 되고, 데이터 타입은 숫자는 int64고 문자형을 object라고 함. 

- 걍.. 객체로 전체를 의미하는 거 같은데.. 굳이 또 문자형이 object라고 해서 뭐지 싶음.  

++ 아래 나와.. 헷갈리지 않게 .. 주의

 

- 여러 타입을 넣을 수 있지만 같은 칼럼에서는 같은 자료형이어야만 함. 

import pandas as pd

two_dimentional_list = [['tasha', 50, 86], ['lynn', 89, 31], ['ben', 68, 91],['nico', 88,75]]

# columns와 index에 값을 넣어주면 됨. 
my_df = pd.DataFrame(two_dimentional_list, columns = ['name', 'english_score', ',math_score'], index = ['a','b','c','d'])
my_df

type(my_df)
#pandas.core.frame.DataFrame

my_df.index
#Index(['a', 'b', 'c', 'd'], dtype='object')

my_df.dtypes
#name             object
 english_score     int64
 ,math_score       int64
 dtype: object

 

- pandas .Series([])는 기본적으로 일차원 배열인데, 일반적인 np.array()나 python 리스트와의 차이점은

컬럼이나 로우에 변수 명을 집어 넣을 수 있다는 것임. 

 

- 사실 pd.DataFrame() 안에 들어갈 값은 

1. python list 

2. numpy array

3. pandas Series

모두 다 가능. 즉 어떻게 만들어주느냐의 차이일 뿐

 

 

import numpy as np
import pandas as pd

two_dimensional_list = [['dongwook', 50, 86], ['sineui', 89, 31], ['ikjoong', 68, 91], ['yoonsoo', 88, 75]]
two_dimensional_array = np.array(two_dimensional_list)
list_of_series = [
    pd.Series(['dongwook', 50, 86]), 
    pd.Series(['sineui', 89, 31]), 
    pd.Series(['ikjoong', 68, 91]), 
    pd.Series(['yoonsoo', 88, 75])
]

# 아래 셋은 모두 동일합니다
df1 = pd.DataFrame(two_dimensional_list)
df2 = pd.DataFrame(two_dimensional_array)
df3 = pd.DataFrame(list_of_series)

print(df1)

#칼럼과 로를 지정하지 않았기 때문 
#          0   1   2
#0  dongwook  50  86
#1    sineui  89  31
#2   ikjoong  68  91
#3   yoonsoo  88  75

 

- 데이터 프레임을 만들 때 칼럼 이름을 설정하지 않아서 그냥 인덱스 값이 나오는 것. 

- 데이터 프레임을 만들 때 columns = ['']로  이름을 추가해 줄 수 있음. 

list_df = pd.DataFrame(two_dimensional_list, columns=['name', 'english_score', 'math_score'])
array_df = pd.DataFrame(two_dimensional_array, columns=['name', 'english_score', 'math_score'])

 

 

- 사실 어차피 2차원 배열로 표를 만들어 내는 것이기 때문에 파이썬 사전으로 넣어주면 더 편한 듯

- 처음부터 key랑 value값으로 칼럼과 로가 구분되고 인덱스를 추가할 때도 편함. 

- 여전히 3개 다 들어갈 수 있음. 

import numpy as np
import pandas as pd

names = ['dongwook', 'sineui', 'ikjoong', 'yoonsoo']
english_scores = [50, 89, 68, 88]
math_scores = [86, 31, 91, 75]

dict1 = {
    'name': names, 
    'english_score': english_scores, 
    'math_score': math_scores
}

dict2 = {
    'name': np.array(names), 
    'english_score': np.array(english_scores), 
    'math_score': np.array(math_scores)
}

dict3 = {
    'name': pd.Series(names), 
    'english_score': pd.Series(english_scores), 
    'math_score': pd.Series(math_scores)
}


# 아래 셋은 모두 동일합니다
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
df3 = pd.DataFrame(dict3)

print(df1)

#       name  english_score  math_score
#0  dongwook             50          86
#1    sineui             89          31
#2   ikjoong             68          91
#3   yoonsoo             88          75

 

- 파이썬 사전이 담긴 리스트는 오히려 편함. 

- 이미 다 지정되어 있기 때문에, pd.DataFram()에 넣어주기만 하면 됨. 

import numpy as np
import pandas as pd

my_list = [
    {'name': 'dongwook', 'english_score': 50, 'math_score': 86},
    {'name': 'sineui', 'english_score': 89, 'math_score': 31},
    {'name': 'ikjoong', 'english_score': 68, 'math_score': 91},
    {'name': 'yoonsoo', 'english_score': 88, 'math_score': 75}
]

df = pd.DataFrame(my_list)
print(df)


#   english_score  math_score      name
#0             50          86  dongwook
#1             89          31    sineui
#2             68          91   ikjoong
#3             88          75   yoonsoo

 

코드잇 '데이터 사이언스 배우기' 강의 중

- 확인은 .dtypes()로 가능 

 

- csv 파일 읽어올 수 있는데.. 현재 running 중인 파일과 같은 폴더에 있어야지만 가능. 

- 처음에 안 넣어놔서 ... jupyter 상의 ui로 편하게 넣으려고 했으나 이동이 안됨 ㅡ ㅡ

++ 코드는 따로 정리 

 


- 헤더

import pandas as pd

iphone_df = pd.read_csv('codeit/data/iphone.csv')

iphone_df

iphone.csv

 

 

근데 만약에 header가 없는 경우에는 아래 값을 맘대로 읽어 오기 때문에, 

- heder = None 을 추가해줘야 함. 

- 변수명 추가하려면, names =[''] --> 칼럼 수에 맞춰서 넣어주면 됨.

iphone_df = pd.read_csv('codeit/data/iphone.csv', header = None)

iphone_df = pd.read_csv('codeit/data/iphone.csv', header = None,
						names = ['출시일', '디스플레이', '메모리', '출시 버전', 'Face ID'])

 

- 맨 처음 헤더 값은 비어있는데 로도 비워 놓은 상태임. 

- 걍 로를 첫 칼럼 자체로 만들어 줄 수도 있음. --> index_col=0 

- 인덱스 칼럼을 0으로 하면, 아래처럼 첫 벡터가 그 자체로 로가 됨. 

--> 이거 진짜 너무 유용함... ㅎ

=> 파일을 읽어 들일 때 특정 column을 인덱스로 지정하고 싶으면, index_col 파라미터를 쓰면 됨. 

=> 칼럼 명이 있다면, 그걸 가지고 와도 됨( index_col = '디스플레이')

 

=> 즉 상품명이 0번 column인 가장 왼쪽에 있으니까, index_col=0임

iphone_df = pd.read_csv('codeit/data/iphone.csv', index_col=0)

 

 

728x90
반응형