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
이고 원소들은 문자열M
과F
로 구성된 리스트이다.
'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) 라고 부른다. 데이터프레임에 조건식을 사용하여 슬라이싱 할 경우 논리연산자 or
와 and
는 사용할 수 없다.
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[]
을 사용한다.