본문 바로가기
python3

파이썬(Python) Pandas 자료구조(Series, DataFrame)

by DongGoo 2023. 1. 9.

Series와 DataFrame

1. Series

객체를 담을 수 있는 1차원 배열같은 자료 구조

 

Series 배열로 생성하기

ser = pd.Series([1,-2,3,0])
ser
Out[55]: 
0    1
1   -2
2    3
3    0
dtype: int64

Serise의 index설정하기

# Series생성과 동시에 index 설정하기
ser2 = pd.Series([3,-9,4], index = ['a','b','c'])
ser2
Out[59]: 
a    3
b   -9
c    4
dtype: int64

# 만들어진 Series에 대입하여 index 설정하기
ser2.index = ['bob','steve','kim']
ser2
Out[60]: 
bob      3
steve   -9
kim      4
dtype: int64

# Serise index 출력
ser2.index
Out[61]: Index(['bob', 'steve', 'kim'], dtype='object')

Series데이터의 특정값 추출하기

# index로 추출
ser2['bob'] 
Out[70]: 3

ser2[['bob','steve','kim']]
Out[71]: 
bob      3
steve   -9
kim      4
dtype: int64

# 값의 연산으로 추출
ser2[ser2>2] 
Out[72]: 
bob    3
kim    4
dtype: int64

# index로 값 변경
ser2['bob'] = 999
ser2
Out[74]: 
bob      999
steve     -9
kim        4
dtype: int64

# 값 하나당 *2를 계산
ser2*2 
Out[75]: 
bob      1998
steve     -18
kim         8
dtype: int64

사전형 데이터로 Series 만들기

# 사전형으로 series만들기
data = {'a':2,'b':-6,'c':99}
ser3 = pd.Series(data)
ser3
Out[76]: 
a     2
b    -6
c    99
dtype: int64

사전형 데이터로 Serise를 만들게 되면 사전의 키값 순으로 index가 나열 된다. index를 지정하고 싶으면 직접 넘겨 주면 된다. 이때 기존에 존재 하지 않던 index가 있다면 해당 값은 null로 취급한다.

list_index = ['a','b','g']
ser3 = pd.Series(data, index = list_index)
ser3
Out[9]: 
a    2.0
b   -6.0
g    NaN
dtype: float64

Series의 null값 찾기

# NAN값은 True로 표시
pd.isnull(ser3)
Out[10]: 
a    False
b    False
g     True
dtype: bool

# NAN값은 False로 표시
pd.notnull(ser3)
Out[11]: 
a     True
b     True
g    False
dtype: bool

Series객체와 Series index에 name속성 부여하기

# Series에 이름 설정
ser3.name = 'series3'

# index에 이름 설정
ser3.index.name = 'number'

ser3
Out[14]: 
number
a    2.0
b   -6.0
g    NaN
Name: series3, dtype: float64

2. DataFrame

DataFrame은 표 같은 스프레드시트 형식의 자료구조이고 여러 개의 컬럼이 있는데 각 컬럼은 서로 다른 종류의 값(숫자, 문자, bool)을 담을 수 있다.

 

사전형 데이터로 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]}
df = pd.DataFrame(data)

df
Out[17]: 
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

head를 사용해 위에서 5개 행만 출력하기

df.head()
Out[18]: 
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

columns명을 사용해서 순서 columns순서 변경하기

pd.DataFrame(data,columns = ['year','pop','state'])
Out[19]: 
   year  pop   state
0  2000  1.5    Ohio
1  2001  1.7    Ohio
2  2002  3.6    Ohio
3  2001  2.4  Nevada
4  2002  2.9  Nevada
5  2003  3.2  Nevada

# Serise와 마찬가지로 없는 열을 입력하면 NAN값이 저장된다
df2 = pd.DataFrame(data,columns = ['year','pop','state','debt'])
df2
Out[20]: 
   year  pop   state debt
0  2000  1.5    Ohio  NaN
1  2001  1.7    Ohio  NaN
2  2002  3.6    Ohio  NaN
3  2001  2.4  Nevada  NaN
4  2002  2.9  Nevada  NaN
5  2003  3.2  Nevada  NaN

columns 추출하기

# 속성형식 접근법
df.year
Out[21]: 
0    2000
1    2001
2    2002
3    2001
4    2002
5    2003
Name: year, dtype: int64

# 사전형식 접근법
df['state']
Out[22]: 
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
5    Nevada
Name: state, dtype: object

columns에 값 대입시키기

하나의 값만 설정하면 해당 값이 해당 columns의 모든 row에 대입된다. 값으로 배열을 입력하게 되면 배열의 값들이 row에 대입 된다. 이때 배열의 수가 행의 수와 일치하지 않으면 오류가 발생한다. 하지만 Series를 대입하게 되면 행의 수가 맞지 않아도 결측치로 대입이 된다.

# 모든 값이 일괄 적용
df2.debt = 1.6
df2
Out[26]: 
   year  pop   state  debt
0  2000  1.5    Ohio   1.6
1  2001  1.7    Ohio   1.6
2  2002  3.6    Ohio   1.6
3  2001  2.4  Nevada   1.6
4  2002  2.9  Nevada   1.6
5  2003  3.2  Nevada   1.6

# 배열을 사용해 배열 값을 대입
df2.debt = np.arange(6.)
df2
Out[32]: 
   year  pop   state  debt
0  2000  1.5    Ohio   0.0
1  2001  1.7    Ohio   1.0
2  2002  3.6    Ohio   2.0
3  2001  2.4  Nevada   3.0
4  2002  2.9  Nevada   4.0
5  2003  3.2  Nevada   5.0

# 행이 맞지 않은 series를 대입했을 경우
ser1 = pd.Series([1.2,1.3,99])
df2.debt = ser1
df2
Out[38]: 
   year  pop   state  debt
0  2000  1.5    Ohio   1.2
1  2001  1.7    Ohio   1.3
2  2002  3.6    Ohio  99.0
3  2001  2.4  Nevada   NaN
4  2002  2.9  Nevada   NaN
5  2003  3.2  Nevada   NaN

del을 사용해 열 삭제하기

del df2['debt']
df2
Out[42]: 
   year  pop   state
0  2000  1.5    Ohio
1  2001  1.7    Ohio
2  2002  3.6    Ohio
3  2001  2.4  Nevada
4  2002  2.9  Nevada
5  2003  3.2  Nevada

중첩 사전데이터를 이용해서 DataFrame 만들기

data = {'nevada': {2001:2.4, 2002:2.9},
        'ohio':{2000:1.5,2001:1.7,2002:3.6}}
df3 = pd.DataFrame(data)
df3
Out[44]: 
      nevada  ohio
2001     2.4   1.7
2002     2.9   3.6
2000     NaN   1.5

DataFrame 전치(row와 columns 뒤집기)

df2.T
Out[45]: 
          0     1     2       3       4       5
year   2000  2001  2002    2001    2002    2003
pop     1.5   1.7   3.6     2.4     2.9     3.2
state  Ohio  Ohio  Ohio  Nevada  Nevada  Nevada

DataFrame name속성 설정하기

df3.index.name = 'year'; df3.columns.name= 'state'
df3
Out[54]: 
state  nevada  ohio
year               
2001      2.4   1.7
2002      2.9   3.6
2000      NaN   1.5