본문 바로가기

pandas

pandas DataFrame

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
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002


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
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002
53.2Nevada2003


근데 테이블 출력 보니깐... 뭔가 마음에 안들어요....

컬럼 순서를 year, state, pop 순서로 보고싶다면,

pd.DataFrame(data, columns=['year', 'state', 'pop'])
yearstatepop
02000Ohio1.5
12001Ohio1.7
22002Ohio3.6
32001Nevada2.4
42002Nevada2.9
52003Nevada3.2

요렇게 예쁜 테이블로 볼 수 있습니다.


만약에 값이 없는데 칼럼에 표시가 되면 어떻게 될까요??

frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
                   index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7NaN
three2002Ohio3.6NaN
four2001Nevada2.4NaN
five2002Nevada2.9NaN
six2003Nevada3.2NaN

debt 항목이 Nan으로 표시되는 것을 볼 수 있습니다.,

index도 숫자에서 one, two, three, four, five, six 로 바뀌었죠!!


frame2 의 칼럼만 보고 싶다면

frame2.columns
frame2
Index(['year', 'state', 'pop', 'debt'], dtype='object')


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

yearstatepopdebt
one2000Ohio1.516.5
two2001Ohio1.716.5
three2002Ohio3.616.5
four2001Nevada2.416.5
five2002Nevada2.916.5
six2003Nevada3.216.5


순서대로 0~5까지의 값으로 채워넣고 싶다면,

frame2['debt'] = np.arange(6.)
frame2
yearstatepopdebt
one2000Ohio1.50.0
two2001Ohio1.71.0
three2002Ohio3.62.0
four2001Nevada2.43.0
five2002Nevada2.94.0
six2003Nevada3.25.0


실제로는 이렇게 사용을 안하겠죠??

DataFrame에 한 컬럼을 수정하고 싶을 땐 1차원 데이터를 저장할 수 있는 Series를 사용합니다.

val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt']= val
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7-1.2
three2002Ohio3.6NaN
four2001Nevada2.4-1.5
five2002Nevada2.9-1.7
six2003Nevada3.2NaN


추가로 "eastern" 항목을 추가하고 싶습니다.

지역이 동부인지 아닌지를 알고 싶은거죠!

frame2['eastern'] =frame2.state =='Ohio'
frame2
yearstatepopdebteastern
one2000Ohio1.50.0True
two2001Ohio1.71.0True
three2002Ohio3.62.0True
four2001Nevada2.43.0False
five2002Nevada2.94.0False
six2003Nevada3.25.0False


이렇게 한번 확인해 보니깐 "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
NevadaOhio
2000NaN1.5
20012.41.7
20022.03.6


그런데.. 행과 열을 바꾸고 싶습니다....

dict구조바꾸고 다시 생각하고 복잡하죠???

그럴땐 이거 하나면 됩니다.

frame3.T
200020012002
NevadaNaN2.42.0
Ohio1.51.73.6


index를 정해서 DataFrame을 만들수도 있습니다.

이때 data에 없는 index가명시될 때는 NaN값으로 표시됩니다.

DataFrame(pop, index=[2001,2002,2003])
NevadaOhio
20012.41.7
20022.03.6
2003NaNNaN


이제 index와 column에 이름을 붙여주고 싶습니다.

frame3.index.name = 'year'
frame3.columns.name='state'
frame3
stateNevadaOhio
year
2000NaN1.5
20012.41.7
20022.03.6


'pandas' 카테고리의 다른 글

pandas Series  (0) 2018.05.22
pandas 원하는 데이터만 가져오기  (0) 2018.04.28