Pandas

import pandas as pd
import numpy as np

 

파이썬으로 데이터를 다루는 경우 정형화된 데이터는 주로 Pandas 와 Numpy를 통해서 다룬다. 


하지만, Numpy는 저수준 API가 대부분 이므로, 여러가지 고급진 기능을 다양하게 사용할 수 있는 Pandas를 애용하는 사람들이 많다. 

또한, Pandas는 리스트, 넘파이 등의 내부 데이터를 비롯하여, 코드 외부에 있는 csv등의 파일도 바로 Pandas객체로 만들수 있다는 장점을 가지고 있다. 

 

 

 

pd.read_csv()

 

판다스를 사용할 때, 가장 첫번째로 하게 되는 것은 아마 pd.read_csv()일 것이다. 

이때, 가장 중요한 것은 파일의 경로를 제대로 쓰는 것이다. 

해당 코드와 파일이 동일한 위치에 있을 경우에는 파일이름.csv로만 적어도 괜찮지만, 

그렇지 않을 경우에는 파일의 위치 또한 같이 적어주어야 한다. 

 

해당 사진을 보면, Pandas_Basic.ipynb 파일과 train.csv파일이 동일한 디렉토리에 있다는 것을 확인할 수 있다. 

이런 경우에는 pd.read_csv('train.csv')라고 코드를 적으면 바로 해당 파일(train.csv)을 불러올 수 있다. 

본 포스팅에서 데이터로 활요한 것은 Kaggle에 있는 Titanic 데이터 셋이다. 

(https://www.kaggle.com/c/titanic해당 주소로 가면 데이터 셋을 다운받을 수 있다.)

titanic_df = pd.read_csv('train.csv')
print('titanic 변수 type : ', type(titanic_df))

titanic_df

 

 

 

 

파일이 동일한 위치에 있지 않을 경우, csv 파일이 정확하게 어느 디렉토리에 있는지 알려주어야 해당 파일을 불러올 수 있다. 

.ipynb파일과 csv파일의 위치가 동일한 경우에도 해당 방법을 사용할 수 있다. 

이 경우, 앞의 경우와는 달리 파일의 디렉토리를 적기 전에 , r을 적어주어야 불러올 수 있다는 것에 유의하자.
('r'은 읽기 전용이라는 의미이다.)

titanic_df = pd.read_csv(r'C:\Users\user\Jupyter Pandas_Numpy\train.csv')
titanic_df.head(3)

 

 

 

 

pd.head() / pd.tail()

 

앞에서 미리 pd.head()라는 함수를 사용했다. 

두 함수는 전체 데이터 중 가장 앞의 데이터 일부 혹은 가장 뒤의 데이터의 일부를 가져오는 함수이다. 

본격적으로 데이터를 다루기 이전에, 어떤 피처(특성)을 가지고 있는지, 그 안에 들어있는 데이터는 어떤 형태로 되어 있는지 확인하기 위해서 사용한다.

굳이 앞에 몇개, 귀에 몇개를 가져와야 하나 싶기도 하지만, 앞으로 다루는 데이터의 크기가 생각 이상으로 큰 경우가 아주 많다. 이런 경우, 위의 함수들을 사용하여 데이터가 어떤지 보는 것은 매우 편리하다. 

괄호안에 숫자를 넣는다면, 해당하는 숫자만큼의 데이터를 볼 수 있다. 초깃값은 5이다. 

 

titanic_df.head()
titanic_df.tail()

 

 

 

 

pd.value_counts()

 

데이터를 다룰떄에 가장 많이 쓰이고, 유용하게 쓰이는 매서드 중에 하나이다. 하지만, 

머신러닝 프로그래밍 중 여러가지 복잡한 과정들 속에서 나오는 경우가 많아,

데이터를 가공하는 과정에서 value_counts() 정확하게 이해하고 사용하는 것이 종종 헷갈리는 경우가 있다. 

일단, Pandas의 객체에는 Series와 DataFrame이라는 2가지 종류의 객체가 있다. 
(Series와 DataFrame의 차이는 별도로 설명 X)

value_counts() 매서드는 Series객체에서만 정의되어 있다. 

즉, DataFrame객체에서는 정의되어 있지 않다

그럼에도 불구하고, 실제로는 Series 객체 보다 DataFrame 객체를 접하는 경우가 훨씬 많고, 
이 점으로 인해 DataFrame객체에서 value_counts() 매서드를 사용해야 하는 경우들이 많이 생긴다. 

해당 매서드를 DataFrame 객체에서 사용하는 경우에는 "인덱싱을 통해서 Series로 추출해낸 다음"

value_counts()매서드를 사용할 수 있는 것이다. 

 

value_counts = titanic_df['Pclass'].value_counts()
print(type(value_counts))
print(value_counts)

 

 

첫번째 코드를 통해서 titanic_df라는 DataFrame 객체에서 ['Pclass']라는 column을 추출하여 Series 객체로 만든 것을 볼 수 있다. 

왼쪽의 3,1,2 값이 해당 Series의 인덱스 값이며, 오른쪽에 있는 491, 216, 184는 데이터 값이다. 

이 숫자들의 의미는 Pclass에 해당하는 피처에서 value값이 1, 2, 3이라는 세가지 종류가 있었고, 각각이 216, 184, 491개가 있다는 의미이다. 

 


 

 

DataFrame 객체 생성 / 변환

 

리스트를 이용해서 DataFrame으로 만들기 

 

리스트, 넘파이의 ndarray, DataFrame은 모두 비슷한 형식이지만, 데이터 가공시에 DataFrame이 가장 많이 사용되는 이유는 column명을 가지고 있기 때문이다. 즉, 2차원의 형태로 표현을 할 수 있기 때문이다. 

 

col_name1 = ['col1']
list1 = [1,2,3]
array1 = np.array(list1)
print('array1 shape : ', array1.shape)

#리스트를 이용해 DataFrame 생성 
df_list1 =  pd.DataFrame(list1, columns = col_name1)
print('1차원 리스트로 만든 DataFrame : \n', df_list1)

#넘파이 ndarray를 이용해 DataFrame 생성 
df_array1 = pd.DataFrame(array1, columns = col_name1)
print('1차원 ndarray로 만든 DataFrame : \n', df_array1)

 

위에서 언급한 차이점을 유념하여,
리스트나 ndarray를 통해서 DataFrame 객체를 만들어야 하는 경우에는 칼럼명에 대한 데이터도 넣어주어야 함을 고려해야 한다.

 

 

딕셔너리를 이용해서 DataFrame 만들기 

 

딕셔너리를 이용하게 되면, 딕셔너리는 DataFrame과 비슷한 형식,

즉, Key 값과 Value값이 따로 정해져 있다. 이로 인해서 리스트를 DataFrame으로 생성할 때 처럼 별도의 인덱스 리스트를 입력하지 않아도 된다.

딕셔너리를 통해서 DataFrame 객체를 생성할 경우, Key 값이 Column 명이 되고, 
해당 value 값들이 인덱스에 따라 순차적으로 들어가게 된다. 

 

#Key는 문자열 칼럼명으로 매핑, Value는 리스트 형 (또는 ndarray) 칼럼 데이터로 매핑
dict = {'col1' : [1, 11], 'col2' : [2,22], 'col3' : [3,33]}
df_dict = pd.DataFrame(dict)
print('딕셔너리로 만든 DataFrmae:\n', df_dict)

 

 

 

DataFrame 객체를 ndarray, list, dictionary로 변환하기

 

DataFrame 객체를 다른 형태의 객체로 바꾸는 것은 ndarray를 제외하면 거의 일어나지 않는다.

따라서 처음 Pandas를 접하는 경우나 깊게 공부를 하지 않아도 되는 경우, 

ndarray로 변환하는 과정만 잘 숙지하고, 나머지 자료형으로 변환하는 경우에는 구글링을 통해 필요할 때 찾아볼 것을 추천한다. 

다만 앞으로 머신러닝 패키지의 입력 인자등에 DataFrame이 아닌 ndarray가 입력 인자로 들어가는 경우, 꼭 변환을 해야하므로, ndarray로의 변환은 잘 숙지하고 있어야 한다. 

 

#DataFrame을 ndarray로 변환
array3 = df_dict.values
print('df_dict.values 타입 : ', type(array3), 'df_dict.values shape:', array3.shape)
print(array3)

 

#DataFrame을 리스트로 변환 
list3 = df_dict.values.tolist()
print('df_dict.values.tolist() 타입 :', type(list3))
print(list3)

#DataFrame을 딕셔너리로 변환
dict3 = df_dict.to_dict('list')
print("\n df_dict.to_dict() 타입 : ",type(dict3))
print(dict3)

 

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기