4.1. 데이터프레임의 정의와 구성요소#

import pandas as pd

4.1.1. 정의#

이제 데이터프레임을 정의해 보자. 다음은 5명의 이름, 성별, 나이, 키가 저장된 데이터프레임을 직접 만드는 코드이다.

df = pd.DataFrame(
    { 'name' : ['이철수', '김영희', '홍길동', 'John Smith', 'Mary Doe'],
      'sex'  : ['M', 'F', 'M', 'M', 'F'],
      'age'  : [ 23, 25, 21, 33, 45],
      'height' : [153.5, 175.3, 163.4, 180.0, 165.7]
    } )
df
name sex age height
0 이철수 M 23 153.5
1 김영희 F 25 175.3
2 홍길동 M 21 163.4
3 John Smith M 33 180.0
4 Mary Doe F 45 165.7
type(df)
pandas.core.frame.DataFrame

각 행을 나타내는 인덱스는 0으로 시작하는 정수 0,1,2,3,4 로 나타나고 각 열을 나타내는 인덱스(열이름)는 문자열로 나타나며 name, sex, age, height 로 나타난다.

위의 코드는 5명의 학생의 이름(name), 성별(sex), 나이(age), 키(height)로 구성된 5개의 행과 4개 열을 가진 데이터프레임 df 이다. pd.DataFrame()pd 로 지정된 pandas 라이브러리의 함수 DataFrame() 을 사용하겠다는 의미이다. 라이브러리의 함수 DataFrame의 괄호 안에 인자는 괄호 { 로 시작하여 괄호 } 로 끝나는 표현식이 들어 간다.

괄호 {} 안에 있는 표현식은 나중에 배울 사전(dictionary) 형식의 데이터를 만들어 준다.

  • 괄호 {} 안에 있는 첫 번째 요소는 이름을 나타내는 열을 만드는 표현식이며 열이름은 name 이고 원소들은 문자열(str)로 구성된 리스트이다.

'name' : ['이철수', '김영희', '홍길동', 'John Smith', 'Mary Doe']
  • 괄호 {} 안에 있는 두 번째 요소는 성별을 나타내는 열을 만드는 표현식이며 열이름은 sex 이고 원소들은 문자열 MF 로 구성된 리스트이다.

'sex'  : ['M', 'F', 'M', 'M', 'F']
  • 괄호 {} 안에 있는 세 번째 요소는 나이을 나타내는 열을 만드는 표현식이며 열이름은 age 이고 원소들은 정수(int)로 구성된 리스트이다.

'age'  : [ 23, 25, 21, 33, 45]
  • 괄호 {} 안에 있는 네 번째 요소는 키를 나타내는 열을 만드는 표현식이며 열이름은 height 이고 원소들은 부동소수점(float)로 구성된 리스트이다.

'height' : [153.5, 175.3, 163.4, 180.0, 165.7]

각 열을 나타내는 4개의 요소는 쉼표 , 로 분리한다.

4.1.2. 열 선택#

데이터프레임에서 다음과 같이 괄호 [] 안에 열이름 또는 열이름으로 구성된 리스트를 넣어서 일부의 열을 선택할 수 있다. 이 경우 열이름은 문자열이어야 한다.

데이터프레임에서 열 또는 행의 일부를 선택하여 추출하는 작업을 슬라이싱(slicing) 이라고 한다.

df['name']
0           이철수
1           김영희
2           홍길동
3    John Smith
4      Mary Doe
Name: name, dtype: object
df[['age', 'height']]
age height
0 23 153.5
1 25 175.3
2 21 163.4
3 33 180.0
4 45 165.7

하나의 열만 슬라이싱하는 경우는 데이터프레임 이름 뒤에 마침표를 붙이고 열이름을 붙이면 된다.

df.sex
0    M
1    F
2    M
3    M
4    F
Name: sex, dtype: object

4.1.3. 행 선택#

이제 특정한 성질을 가진 행, 즉 자료의 구성 단위의 일부만을 선택해 보자. 데이터프레임 뒤 괄호 [] 안에 비교연산자를 이용한 조건 표현식을 넣어주면 조건이 만족하는 행만 추출된다.

예를 들어 남자 구성원을 다음과 같이 슬라이싱할 수 있다.

df[ df['sex'] == 'M' ]
name sex age height
0 이철수 M 23 153.5
2 홍길동 M 21 163.4
3 John Smith M 33 180.0

위에서 사용한 조건식은 df['sex'] == 'M' 로서 df['sex'] 의 자료를 각각 문자열 M 과 비교하여 참이면 True, 거짓이면 False 로 결과를 생성하고 True 인 행만 슬라이싱 해준다.

df['sex'] == 'M'
0     True
1    False
2     True
3     True
4    False
Name: sex, dtype: bool

자료에서 선택해야할 경우의 수가 많은 경우 다음과 같은 .isin() 메소드를 사용할 수 있다. .isin 함수의 괄호 안에 선택할 문자 또는 숫자를 리스트 형태로 넣어준다.

예를 들어 나이가 25세와 33세인 사람만 슬라이싱 해보자.

df[ df['age'].isin([25,33]) ]
name sex age height
1 김영희 F 25 175.3
3 John Smith M 33 180.0

만약 키가 160 이상인 남자 구성원만 슬라이싱 하려면 다음과 같은 명령어를 사용한다.

df[ (df['sex'] == 'M') & (df['height'] >= 160.0) ]
name sex age height
2 홍길동 M 21 163.4
3 John Smith M 33 180.0

만약 나이가 30세 이하 또는 키가 160 미만인 행만 슬라이싱 하려면 다음과 같은 명령어를 사용한다.

df[ (df['age'] <= 30) | (df['height'] < 160.0) ]
name sex age height
0 이철수 M 23 153.5
1 김영희 F 25 175.3
2 홍길동 M 21 163.4

데이터프레임에서 행을 조건에 따라서 슬라이싱 할 때 다음과 같은 규칙을 따른다.

  • 비교연산자 <, <=, >, >=, !=, == 을 사용한다.

  • 두 개 이상의 비교 표현식을 연결할 경우 또는(OR)| 을 사용하고 그리고(AND)& 를 사용한다.

  • 비교 표현식을 연결할 경우 표현식은 언제나 괄호 () 로 묶어준다.

참고로 두 개 이상의 비교 표현식을 연결할 경우 사용하는 연산자 |& 는 비트단위연산자(bit-wise operator) 라고 부른다. 데이터프레임에 조건식을 사용하여 슬라이싱 할 경우 논리연산자 orand 는 사용할 수 없다.

4.1.4. 행과 열 선택#

이제 특정한 열과 행을 동시에 슬라이싱 해보자.

만약 키가 170 이상인 사람들의 이름이 필요하면 다음과 같이 슬라이싱할 수 있다. 괄호에서 첫 부분은 행에 대한 조건을 쓰고 컴마 , 로 분리한 후 열이름를 써준다.

여기서 유의해할 점은 행과 열을 동시에 슬라이싱할 경우 테이터프레임 이름 뒤에 .loc를 붙여주어야 한다. 만약 붙여주지 않으면 오류가 발생한다.

df_1 = df.loc[ (df['height'] >= 170.0) , 'name']
df_1
1           김영희
3    John Smith
Name: name, dtype: object
df.loc[ (df['sex'] == 'M') , ['name', 'height']]
name height
0 이철수 153.5
2 홍길동 163.4
3 John Smith 180.0

데이터프레임의 행과 열에 대한 인덱스를 숫자로 사용하여 슬라이싱하려면 데이터프레임 이름 뒤에 iloc 을 붙여주고 괄호 [] 안에 행과 열 순서의 위치를 써주면 된다. 이 경우 파이썬은 모든 위치는 0으로 시작하는데 유의하자.

하나의 위치가 아닌 여러개의 연속적인 위치는 x:y 형태이 범위 형식을 사용하여 지칭한다. 모든 열과 행을 지칭하는 경우 공란으로 넣거나 :을 사용한다.

df.iloc[0,0]
'이철수'
df.iloc[4,3]
165.7
df.iloc[3,1:3]
sex     M
age    33
Name: 3, dtype: object
df.iloc[:,2]
0    23
1    25
2    21
3    33
4    45
Name: age, dtype: int64
df.iloc[0,:]
name        이철수
sex           M
age          23
height    153.5
Name: 0, dtype: object

4.1.5. 참고#

데이터프레임을 구성하는 하나의 행 또는 열은 시리즈(Series) 란 형식으로 저장된다.

df['sex']
0    M
1    F
2    M
3    M
4    F
Name: sex, dtype: object
type(df['sex'])
pandas.core.series.Series
df.iloc[0,:]
name        이철수
sex           M
age          23
height    153.5
Name: 0, dtype: object
type(df.iloc[0,:])
pandas.core.series.Series

데이터프레임의 인덱스는 행과 열을 지칭할 때 사용한다. 데이터프레임을 슬라이싱할 때 인덱스는 다음과 같은 두 종류의 형식을 사용할 수 있다.

  • 라벨(label, 이름)에 기반한 인덱스

    • 데이타프레임의 열이름(column name)으로 지칭하거나 또는 행을 조건식을 이용한 True, False 로 선택할 때 사용한다.

    • 행과 열을 모두 슬라이싱 하는 경우 .loc[]을 사용한다.

  • 위치(integer position)에 기반한 인덱스

    • 행과 열 순서의 위치를 나타내는 정수를 사용하여 슬라이싱한다.

    • 모든 위치는 0으로 시작한다.

    • .iloc[] 을 사용한다.