pandas의 자료 구조 하나더 DataFrame에 대해서 알아보죠!!
Series가 있는데 왜 DataFarme 이 필요할까요??
Series는 1차원적인 데이터만 저장합니다.
그러나.. 세상은 그렇게 단순하지가 않죠..
일단 필요한 모듈부터 불러옵니다.
import pandas as pd from pandas import Series from pandas import DataFrame
DataFrame 데이터를 저장해 보고 출력해 봅니다.
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9] } frame = DataFrame(data) frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
Series와 다른점 눈치 채셨나요???
Series와 한번 비교해 보겠습니다.
sdata = {'Ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000} obj3= Series(sdata) obj3
Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64
Series는 1차원적은 데이터만 저장할수 있다면 DataFrame은 다양하게 표 형식의 데이터도 저장할 수 있습니다.
실제로 많이 보는 것도 표형식으로 정리해서 보고 그래프 그리고 챠트도 그리죠!!
DataFrame에 대해 더 자세히 보도록 하죠!
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year':[2000,2001,2002,2001,2002, 2003], 'pop':[1.5,1.7,3.6,2.4,2.9,3.2] } frame = DataFrame(data) frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
5 | 3.2 | Nevada | 2003 |
근데 테이블 출력 보니깐... 뭔가 마음에 안들어요....
컬럼 순서를 year, state, pop 순서로 보고싶다면,
pd.DataFrame(data, columns=['year', 'state', 'pop'])
year | state | pop | |
---|---|---|---|
0 | 2000 | Ohio | 1.5 |
1 | 2001 | Ohio | 1.7 |
2 | 2002 | Ohio | 3.6 |
3 | 2001 | Nevada | 2.4 |
4 | 2002 | Nevada | 2.9 |
5 | 2003 | Nevada | 3.2 |
요렇게 예쁜 테이블로 볼 수 있습니다.
만약에 값이 없는데 칼럼에 표시가 되면 어떻게 될까요??
frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six']) frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
six | 2003 | Nevada | 3.2 | NaN |
debt 항목이 Nan으로 표시되는 것을 볼 수 있습니다.,
index도 숫자에서 one, two, three, four, five, six 로 바뀌었죠!!
frame2 의 칼럼만 보고 싶다면
frame2.columns frame2
state 에 해당하는 값만 보고 싶다면,
frame2['state']
one Ohio two Ohio three Ohio four Nevada five Nevada Name: state, dtype: object
또는 이렇게도 접근할 수 있습니다.
frame2.state
one Ohio two Ohio three Ohio four Nevada five Nevada six Nevada Name: state, dtype: object
이제 "열" 말고 "행"을 가져와볼까요?
"행"을 가져올때는 loc 를 사용해서 가져올 수 있습니다.
frame2.loc['three']
year 2002 state Ohio pop 3.6 debt NaN Name: three, dtype: object
이제 frame2의 'debt' 칼럼을 채워보도록하죠!
'debt' 항목이 한가지 값으로 채워졌습니다.
frame2['debt'] = 16.5 frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 16.5 |
two | 2001 | Ohio | 1.7 | 16.5 |
three | 2002 | Ohio | 3.6 | 16.5 |
four | 2001 | Nevada | 2.4 | 16.5 |
five | 2002 | Nevada | 2.9 | 16.5 |
six | 2003 | Nevada | 3.2 | 16.5 |
순서대로 0~5까지의 값으로 채워넣고 싶다면,
frame2['debt'] = np.arange(6.) frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 0.0 |
two | 2001 | Ohio | 1.7 | 1.0 |
three | 2002 | Ohio | 3.6 | 2.0 |
four | 2001 | Nevada | 2.4 | 3.0 |
five | 2002 | Nevada | 2.9 | 4.0 |
six | 2003 | Nevada | 3.2 | 5.0 |
실제로는 이렇게 사용을 안하겠죠??
DataFrame에 한 컬럼을 수정하고 싶을 땐 1차원 데이터를 저장할 수 있는 Series를 사용합니다.
val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five']) frame2['debt']= val frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | -1.2 |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | -1.5 |
five | 2002 | Nevada | 2.9 | -1.7 |
six | 2003 | Nevada | 3.2 | NaN |
추가로 "eastern" 항목을 추가하고 싶습니다.
지역이 동부인지 아닌지를 알고 싶은거죠!
frame2['eastern'] =frame2.state =='Ohio' frame2
year | state | pop | debt | eastern | |
---|---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 0.0 | True |
two | 2001 | Ohio | 1.7 | 1.0 | True |
three | 2002 | Ohio | 3.6 | 2.0 | True |
four | 2001 | Nevada | 2.4 | 3.0 | False |
five | 2002 | Nevada | 2.9 | 4.0 | False |
six | 2003 | Nevada | 3.2 | 5.0 | False |
이렇게 한번 확인해 보니깐 "eastern"항목이 필요 없어졌습니다.
"eastern"항목을 지워볼까요?
del frame2['eastern'] frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
잘 지워진 것을 확인해 볼 수 있습니다.
또다른 python 데이터 구조를 DataFrame에 저장해 보겠습니다.
dict안에 또 dict 가 있는 구조입니다.
pop = {'Nevada':{2001:2.4, 2002:2.0}, 'Ohio':{2000:1.5, 2001:1.7, 2002:3.6}} frame3 = DataFrame(pop) frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 1.7 |
2002 | 2.0 | 3.6 |
그런데.. 행과 열을 바꾸고 싶습니다....
dict구조바꾸고 다시 생각하고 복잡하죠???
그럴땐 이거 하나면 됩니다.
frame3.T
2000 | 2001 | 2002 | |
---|---|---|---|
Nevada | NaN | 2.4 | 2.0 |
Ohio | 1.5 | 1.7 | 3.6 |
index를 정해서 DataFrame을 만들수도 있습니다.
이때 data에 없는 index가명시될 때는 NaN값으로 표시됩니다.
DataFrame(pop, index=[2001,2002,2003])
Nevada | Ohio | |
---|---|---|
2001 | 2.4 | 1.7 |
2002 | 2.0 | 3.6 |
2003 | NaN | NaN |
이제 index와 column에 이름을 붙여주고 싶습니다.
frame3.index.name = 'year' frame3.columns.name='state' frame3
state | Nevada | Ohio |
---|---|---|
year | ||
2000 | NaN | 1.5 |
2001 | 2.4 | 1.7 |
2002 | 2.0 | 3.6 |
'pandas' 카테고리의 다른 글
pandas Series (0) | 2018.05.22 |
---|---|
pandas 원하는 데이터만 가져오기 (0) | 2018.04.28 |