본문 바로가기

Computer Science/파이썬

[Python] 데이터 전처리 3 - DataFrame 슬라이스 (인덱서 loc, iloc)

python 에서는 연속되는 여러개의 요소를 가진 자료형을 시퀀스 자료형(Sequence Types)이라고 한다.
그리고 이 시퀀스 자료형들은 자신의 하위요소에 접근하기 위해 슬라이스(Slice)를 문법을 사용한다.
* 배열, 문자열, Numpy 배열, Pandas의 DataFrame 에서 슬라이스 구문을 사용할 수 있다.
but. 구문은 같지만 내부 동작은 다르다. 따라서 열의 슬라이스, DataFrame의 슬라이스는 다른 결과를 나타낼 수 있다.

인덱서 loc, iloc

1. loc = label이나 조건표현으로 선택하는 방법

Access a group of rows and columns by label(s) or a boolean array.

## row 행 선택
# 선택하고 싶은 row만 선택 == Series로 반환됨[]
data.loc['선택하고 싶은 row name']  

# 선택하고 싶은 rows 둘다 선택 == DataFrame으로 반환됨[[]]
data.loc[['선택하고 싶은 row name 1','선택하고 싶은 row name 2']] 

## row / column 행-열 동시 선택 [[]] 
data.loc[['선택하고 싶은 row name1','선택하고 싶은 row name2'],['선택하고 싶은 column name1', '선택하고 싶은 column name2', 'city']]
#위와 동일 but 범위로 표시
data.loc[['선택하고 싶은 row name1','선택하고 싶은 row name2'], '선택하고 싶은 column name 시작':'선택하고 싶은 column name 마지막']
## indexing 을 할 경우
# 인덱싱을 할 수 잇는 컬럼으로 인덱스를 지정해준다.(inplace=True)일경우 기존의 인덱스를 대체한다.
df.set_index('인덱싱할col name', inplace=True)
# index 컬럼에서 선택할 row를 찾는다. (예시 'id' = 487)
data.loc[487]

2. iloc = 행번호(row number)로 선택하는 방법.

어떻게 선택하느냐에 따라 Series로 값이 반환 될 수 있고 DataFrame으로 반환 될 수 도 있다.

Purely integer-location based indexing for selection by position

# rows:
# data의 첫번째 행만
df.iloc[0] 
# 두번째 행만
df.iloc[1]
# 마지막 행만
df.iloc[-1] 

# Columns: 
# 첫번째 열만
df.iloc[:,0]
# 두번째 열만
df.iloc[:,1] 
 # 마지막 열만
df.iloc[:,-1]

## df.iloc[: <-- :는 row전체 인덱싱했다는 뜻
# 첫~5개 row만, 0~4까지 선택됨
data.iloc[0:5] 

# 첫~2개 column만, 0~1까지 선택됨
data.iloc[:, 0:2]

# 1st, 4th, 7th, 25th row와 + 1st 6th 7th column만
data.iloc[[0,3,6,24], [0,5,6]] 

# 첫~5개 row와(0~4까지 선택됨) 5th, 6th, 7th column만(5~7까지 선택됨)
data.iloc[0:5, 5:8] 

3. logical index 와 .loc 활용

### 참/거짓, logical index 와 .loc 활용
# 원하는 column에서 원하는 특정 값의 row전체를 출력하고 싶다.
df[df['원하는 column'] == '원하는 column의 row값']
# 원하는 column에서 원하는 특정 값의 row에서 특정 column만 출력하고 싶다. [] dtype = series
df.loc[df['원하는 column'] == '원하는 column의 row값', '특정column name']

# 원하는 column에서 원하는 특정 값의 row에서 특정 column만 출력하고 싶다. [] dtype = DataFrame
df.loc[df['원하는 column'] == '원하는 column의 row값', ['특정column name']]

4. Boolean 활용

# Blooean으로 반환
df.A > 15

a False

b False

c True

Name: A, dtype: bool

# 위의 boolean을 DataFrame으로 반환
df.loc[df.A > 15]

[out]
	A	B	C	D
c	18	19	20	21

# boolean을 원하는 column의 값만 DataFrame으로 반환
df.loc[df.A > 10, ["원하는 column name 1", "원하는 column name 2"]]