지난 포스팅에 이어 파이썬 데이터프레임 인덱싱 하는 방법을 좀 더 자세히 살펴보려고 합니다. 엑셀형태의 데이터를 읽어오는것 부터 데이터프레임에서 원하는 조건을 만족하는 행과 열을 간단하게 선택하는 방법에 대하여 소개하겠습니다.
파이썬 엑셀 데이터 불러오기
데이터를 다룰 때 가장 많이 저장하는 방식이 엑셀 데이터일 것 같습니다. 파이썬에서 pandas 모듈을 이용하면 엑셀데이터 터를 csv나 xlsx 형태 종류에 따라 모두 불러올 수 있습니다.
import pandas as pd
db=pd.read_csv("D:\\My_venv\\db.csv", encoding='euc-kr')
db
Out[3]:
R_TIME NAME STATUS
0 6:28 MNT Y
1 7:24 MNT Y
2 8:06 MNT N
3 11:34 MNT N
4 17:01 MNT Y
5 18:04 MNT N
6 18:39 MNT Y
7 6:28 SKY Y
8 7:24 SKY N
9 8:06 SKY N
10 11:34 SKY N
11 17:01 SKY Y
12 18:04 SKY Y
13 18:39 SKY N
db=pd.read_excel("D:\\My_venv\\db.xlsx", sheet_name=0)
csv 형태의 경우 read_csv 함수로 데이터를 불러올 수 있으며, xlsx 형태는 read_excel 함수로 데이터를 불러올 수 있습니다. 위의 데이터에는 한글이 포함되지 않았는데, csv 데이터를 로딩했을 때 종종 한글이 깨진 경우가 있습니다. 이때 인코딩을 'euc-kr'로 입력해주면 정상적으로 로딩됩니다. 저는 csv 형태의 데이터를 로딩할 때 습관적으로 인코딩을 입력해줍니다.
엑셀형태를 불러올 때 sheet_name은 엑셀에서의 sheet 이름을 의미합니다. 위에서 저와 같이 숫자로 입력해도 가능하고, 문자열로 입력해도 로딩이 가능합니다. 만약 sheet_name을 생략할 경우에는 제일 첫번째 시트를 불러옵니다.
위 데이터에 대해 간단하게 설명 드리면 R_TIME, NAME, STATUS 3가지 변수가 포함되어 있고, 총 행의 개수는 14개가 포함되어 있습니다.
데이터프레임 인덱싱 하기
1. iloc 와 loc 함수 이용하기
lic 함수는 데이터프레임의 행이나 컬럼의 이름이나 boolean array로 접근 하고 iloc 함수는 데이터 프레임의 index 값으로 접근한다고 이해하면 간단합니다.
db.loc[10]
Out[31]:
R_TIME 11:34
NAME SKY
STATUS N
Name: 10, dtype: object
db.iloc[10]
Out[32]:
R_TIME 11:34
NAME SKY
STATUS N
Name: 10, dtype: object
11번째 행에 해당하는 모든 값들을 불러올 때 loc['행번호'] 혹은 iloc['행번호']로 입력해야 합니다. db의 가장 첫번째 열은 index이기 때문에 여기까지는 loc와 iloc의 결과가 동일합니다.
db.loc[10,"R_TIME"]
Out[33]: '11:34'
db.iloc[10,0]
Out[34]: '11:34'
하지만 행과 열을 모두 선택하고 싶을 때에는 loc는 [행번호, 열이름]으로 입력해야 하고, iloc는 [행번호, 열번호]로 입력해야 합니다.
2. 변수명 이용하기
두번째 방법은 변수명을 직접 입력하는 방법입니다. loc와 iloc는 행이 우선적이라고 생각한다면, 변수명을 선택하는 방식은 열이 우선적이라고 생각하시면 됩니다.
db['R_TIME']
Out[35]:
0 6:28
1 7:24
2 8:06
3 11:34
4 17:01
5 18:04
6 18:39
7 6:28
8 7:24
9 8:06
10 11:34
11 17:01
12 18:04
13 18:39
Name: R_TIME, dtype: object
db['R_TIME'][10]
Out[36]: '11:34'
데이터프레임['열이름']을 입력하면 해당하는 열의 모든 데이터가 출력됩니다. 아까와 같이 R_TIME의 11번째 값을 추출하기 위해서는 열이름을 지정하고 해당 행의 숫자를 입력하면 같은 결과("11:34")가 출력된 것을 확인할 수 있습니다. 저는 개인적으로 자리수에 따른 인덱싱을 할 때 대부분 iloc를 이용하고, 열 이름으로 지정할 때에는 직접 변수명 입력하는 방식으로 데이터를 인덱싱합니다. loc 함수는 변수명으로 입력하는 방식과 순서만 다르지 동일한데, 코드를 조금 더 적어야 하기 때문에 잘 사용하지 않습니다.
상세 조건에 따라 데이터 추출하기
이번에는 데이터프레임에서 원하는 조건을 만족하는 값들을 추출하는 방법을 소개드리겠습니다. 먼저 db에서 시간이 7시 00분부터 8시 50분까지 해당하는 값을 추출해보겠습니다.
db[(db['R_TIME']>="7:00") & (db['R_TIME']<="8:50")]
Out[40]:
R_TIME NAME STATUS
1 7:24 MNT Y
2 8:06 MNT N
8 7:24 SKY N
9 8:06 SKY N
db[(db.iloc[:,0]>="7:00") & (db.iloc[:,0]<="8:50")]
Out[41]:
R_TIME NAME STATUS
1 7:24 MNT Y
2 8:06 MNT N
8 7:24 SKY N
9 8:06 SKY N
데이터프레임에서 원하는 조건 값을 추출할 때에는 "데이터프레임[(첫번째 조건) & (두번째 조건)] "으로 이용할 수 있습니다. 여기서 조건이 하나일 때에는 굳이 괄호는 입력하지 않으셔도 되지만, 2개 이상의 조건일 때에는 반드시 괄호를 입력해주어야 합니다. 조건을 입력할 때에도 앞서 소개드린 iloc를 이용하는 방식과 변수명을 이용하는 방식으로 사용할 수 있습니다.
이렇게 추출한 값에서 만약 STATUS 변수가 Y인 값만 추출해보겠습니다. 첫번째 방법은 select라는 변수에 앞서 조건을 만족하는 값들을 정의해주고, 같은 방식으로 STATUS가 Y인 조건을 입력해주어 값을 추출 했습니다. 두번째 방법은 처음 조건을 입력할 때 세번째 조건을 입력하여 한번에 결과를 출력하였습니다.
select=db[(db['R_TIME']>="7:00") & (db['R_TIME']<="8:50")]
select[select['STATUS']=="Y"]
Out[49]:
R_TIME NAME STATUS
1 7:24 MNT Y
db[(db['R_TIME']>="7:00") & (db['R_TIME']<="8:50") & (select['STATUS']=="Y")]
Out[50]:
R_TIME NAME STATUS
1 7:24 MNT Y
댓글