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])
공부를 진행하기에 앞서서 필요한 csv 파일을 다운받아야 한다. 대표적인 파일 중에 하나는 타이타닉 데이터이다.
# 데이터 불러오기
import pandas as pd
df = pd.read_csv('./train.csv')
df.head()
pandas의 read_csv 를 이용하여 csv 파일을 불러들였으며 head( ) 를 이용해 처음부터 5개의 데이터만을 보였다. 보는 바와 같이 column 은 총 12개로 보여진다. 첫 5개의 데이터를 보여주는 것도 있지만 마지막 5개의 데이터를 보여주는 tail( )도 있다는 것을 알아두자.
여기서 알아두면 좋은 점은 인덱스를 설정하는 index_col 의 기능이다.
df = pd.read_csv('./train.csv', index_col='PassengerId')
df.head()
이전과 달라진 점은 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']]
df.iloc[[1,2,3], [1,2,3]]
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 로 설정하였다. 그러면 보는 바와 같이 정상적으로 삭제된 모습을 볼 수 있다.
'데이터 분석 > 자료구조(Data structure)' 카테고리의 다른 글
파이썬 - Pandas 기초 정리(DataFrame - 3) : inner join / outer join (0) | 2020.12.23 |
---|---|
파이썬 - Pandas 기초 정리(DataFrame - 2) (0) | 2020.12.23 |
파이썬 - Pandas 기초 정리(Series) (0) | 2020.12.21 |
파이썬 - Numpy 기초 정리(2) (0) | 2020.12.17 |
파이썬 - Numpy 기초 정리(1) (0) | 2020.12.16 |