데이터 분석/자료구조(Data structure)

파이썬 - Pandas 기초 정리(DataFrame - 1)

Jerry Jun 2020. 12. 22. 11:37
728x90

Pandas 모듈에서 가장 많이 사용되는 것이 DataFrame 이라 해도 과언이 아니다.

저번 게시물에서는 Series(1차원)을 다루었지만 이번에는 DataFrame(2차원)을 다룬다.

 

DataFrame

  • 2차원(row, column) 으로 구성되어 있음
  • 일반적인 데이터(csv 등)가 이런 형식으로 되어 있음

 

1. DataFrame 만들기

  • 일반적으로 DataFrame 은 key 와 value 로 이루어져 있다.
data = {10:['a', 'e', 'f'], 20:['b', 'o', 'q'], 30:['c', 'z', 's']}
data_frame = pd.DataFrame(data, index=np.arange(1,4))
data_frame
------------------------------------
	10	20	30
1	a	b	c
2	e	o	z
3	f	q	s

위와 같이 key 와 value 를 중괄호(dict) 형식으로 넣으면 DataFrame 이 완성된다.

물론 다수의 Series 를 합쳐서 DataFrame 으로 만드는 것도 가능하다.

 

series1 = pd.Series([1,2,3], ['a', 'e', 'f'])
series2 = pd.Series([4,5,6], ['b', 'o', 'q'])
series3 = pd.Series([7,8,9], ['c', 'z', 's'])
pd.DataFrame([series1, series2, series3])

 

dataframe_series

 

공부를 진행하기에 앞서서 필요한 csv 파일을 다운받아야 한다. 대표적인 파일 중에 하나는 타이타닉 데이터이다.

 

타이타닉 캐글 데이터 다운로드

 

Titanic - Machine Learning from Disaster

Start here! Predict survival on the Titanic and get familiar with ML basics

www.kaggle.com

 

# 데이터 불러오기

import pandas as pd
df = pd.read_csv('./train.csv')
df.head()

titanic data

pandas의 read_csv 를 이용하여 csv 파일을 불러들였으며 head( ) 를 이용해 처음부터 5개의 데이터만을 보였다. 보는 바와 같이 column 은 총 12개로 보여진다. 첫 5개의 데이터를 보여주는 것도 있지만 마지막 5개의 데이터를 보여주는 tail( )도 있다는 것을 알아두자.

 

 

여기서 알아두면 좋은 점은 인덱스를 설정하는 index_col 의 기능이다.

df = pd.read_csv('./train.csv', index_col='PassengerId')
df.head()

inndex_col data

이전과 달라진 점은 0으로 시작하는 인덱스가 사라졌다는 것이다. "PassengerId"는 중복되지 않는 고유의 값이므로 인덱스로 사용하기 알맞다. 이외에도 header 를 무시할 수 있는 header 와 원하는 column 만을 가져오는 usecols 등 많은 기능이 숨어있다.

 

# 데이터 정보 알아보기

(1) shape

df.shape
---------------
(891, 12)

 

shape( ) 를 활용하여 데이터의 크기를 알 수 있다. 지금의 경우는 12개 종류의 데이터가 891 개 있다는 것을 알 수 있다.

 

 

(2) describe

df.describe()

타이타닉 정보 요약

describe( ) 함수는 데이터의 숫자들을 총 정리해주는 기능을 한다. 타이타닉 데이터의 column 은 총 12개 인데 위의 사진을 보면 7개 밖에 보이지 않는다. 그 이유는 나머지 데이터는 숫자형이 아니기 때문에 계산할 수 없어서이다.

 

 

(3) info

df.info()
-----------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

info( ) 함수를 이용해서 간략하고 간편하게 모든 정보를 볼 수 있다. 데이터타입, 개수, column 명 등을 알아볼 수 있고 중요하게 볼 것은 non-null 이다. 이 함수를 통해 결측치를 알 수가 있다. 지금 경우에서는 Age 데이터가 714 로 되어있는 것을 보았을 때, 177개의 데이터는 차후 처리를 해야한다는 것을 알 수 있다.

 


# 특정 데이터 가져오기

df['Age']
-------------------
PassengerId
1      22.0
2      38.0
3      26.0
4      35.0
5      35.0
       ... 
887    27.0
888    19.0
889     NaN
890    26.0
891    32.0
Name: Age, Length: 891, dtype: float64

DataFrame 에서 특정 컬럼에 대한 데이터를 가져올 때는 대괄호를 이용한다. 위의 경우에는 index 로 설정되어있는 PassengerId 에 맞춰 Age 데이터를 가져왔다.

 

df[['Age', 'Survived']]

특정 컬럼 확인

다수의 특정 컬럼을 가져올 때에는 대괄호를 하나 더 씌워서 출력해준다.

 

 

# 특정 row 선택하기(loc, iloc)

  • loc : index 를 활용한다

  • iloc : 0 부터 시작하는 인덱스 활용

df.loc[200]
---------------------------
Survived                                         0
Pclass                                           2
Name        Yrois, Miss. Henriette ("Mrs Harbeck")
Sex                                         female
Age                                             24
SibSp                                            0
Parch                                            0
Ticket                                      248747
Fare                                            13
Cabin                                          NaN
Embarked                                         S
Name: 200, dtype: object


df.iloc[200]
----------------------------
Survived                                 0
Pclass                                   3
Name        Vande Walle, Mr. Nestor Cyriel
Sex                                   male
Age                                     28
SibSp                                    0
Parch                                    0
Ticket                              345770
Fare                                   9.5
Cabin                                  NaN
Embarked                                 S
Name: 201, dtype: object

혹시나 헷갈릴 수 있어 비교를 해 보았다. 이 둘의 차이점은 무엇일까.

지금의 경우에서 index 로 설정되어 있는 것은 PassengerId 이다. 그래서 index 를 이용하는 loc( )PassengerId 를 이용하여 출력하고 iloc( )는 DataFrame 의 순서를 그대로 이용한다. (0 부터)

 

df.loc[[1,2,3], ['Name', 'Age', 'Ticket']]

loc result

 

df.iloc[[1,2,3], [1,2,3]]

iloc result

 

loc 와 iloc 모두 row 와 column 을 동시에 명시하여 출력할 수 있다. loc( )에서는 column 명을 써야하고, iloc( ) 에서는 column 의 index 를 써야하는 차이점이 있다.

 

 

# 조건에 맞는 데이터 선택하기

age = (df['Age'] >= 20) & (df['Age'] < 30)
pclass = df['Pclass'] == 3
data = df[age & pclass]
data.loc[:,['Age', 'Pclass', 'Name', 'Ticket']]

조건부 실행

조건은 다음과 같다.

  • 나이가 20대인 사람

  • 객실등급 3등급

  • 나이, 객실등급, 이름, 티켓정보만 출력할 것

각각의 조건들을 따로 만들고 데이터프레임을 호출하여 합쳤다. 원하는 column 을 보기 위해 배웠던 loc 를 이용하였다.

 

 

# Column 추가/삭제하기

df['double_age'] = df['Age'] * 2
df.head()

열 생성

column 을 추가하는 방법은 간단하다. 원하는 데이터를 구현한 것을 이름을 새로 만들어 dataframe 에 넣으면 추가된다. 지금 경우는 Age 를 2배로 계산하여 double_age 열을 새로 만들었다.

 

 

df.drop('double_age', axis = 1, inplace = True)
df.head()

열 삭제

삭제는 drop( )을 이용하면 된다. 여기에서 중요한 것은 axis 를 설정하는 것이다. 나는 열을 제거해야 하니 1로 설정하였다. 0은 행을 뜻한다. 그리고 바로 저장할 수 있도록 inplace 를 True 로 설정하였다. 그러면 보는 바와 같이 정상적으로 삭제된 모습을 볼 수 있다.

300x250