[판다스 6화] 원하는 데이터만 선택하기: loc와 iloc 사용법 및 차이점 | Python Pandas | 빅분기, 빅데이터분석기사 실기

파이썬(Python) 판다스(Pandas)를 활용한 데이터 분석 과정에서 데이터프레임을 구축하고 구조를 파악했다면, 그다음으로 가장 많이 수행하는 작업은 특정 조건이나 위치에 맞는 데이터를 선택하고 추출하는 것입니다. 수많은 행과 열 중에서 분석에 필요한 부분만 골라내는 인덱싱(Indexing)과 슬라이싱(Slicing)은 전처리 작업의 기본이자 핵심입니다.

판다스에서 데이터를 선택하는 방법은 다양하지만, 실무와 빅데이터분석기사(빅분기) 실기 시험에서 가장 핵심이 되는 도구는 바로 lociloc 속성입니다. 두 속성은 언뜻 비슷해 보이지만 데이터를 찾아가는 기준이 완전히 다르기 때문에 이를 명확히 구분하지 못하면 데이터 추출 시 예상치 못한 오류를 마주하게 됩니다. 이번 글에서는 lociloc의 개념부터 구체적인 비즈니스 활용 예시, 그리고 둘의 차이점을 상세하게 정리해 보겠습니다.

1. 명칭 기반의 데이터 선택: loc 속성 이해하기

1.1. loc의 정의와 특징

loc는 레이블(Label) 기반 인덱싱을 수행하는 속성으로, 행 인덱스와 열 이름(Label)을 기준으로 데이터를 선택합니다. 즉, 데이터프레임의 행 인덱스 이름이나 열(컬럼) 이름을 기준으로 데이터에 접근합니다.

기본적인 사용 형식은 df.loc[행_인덱스_명칭, 열_컬럼_명칭]입니다.

1.2. 비즈니스 예시로 보는 loc 활용

온라인 쇼핑몰의 고객 정보 데이터를 바탕으로 특정 고객의 구매 등급을 조회하는 비즈니스 시나리오를 살펴보겠습니다.

import pandas as pd

# 샘플 데이터 생성
customer_info = {
    '이름': ['김철수', '이영희', '박민수', '최지우'],
    '구매등급': ['Gold', 'Silver', 'Bronze', 'VIP'],
    '누적구매액': [500000, 150000, 80000, 1200000]
}
df = pd.DataFrame(customer_info, index=['C-101', 'C-102', 'C-103', 'C-104'])
df

이 데이터프레임에서 행 인덱스는 ‘C-101’부터 ‘C-104’까지의 명칭이고, 컬럼명은 ‘이름’, ‘구매등급’, ‘누적구매액’입니다. 여기서 loc를 사용하여 데이터를 추출해 보겠습니다.

# 1. 단일 행 데이터 선택 (시리즈 반환)
customer_102 = df.loc['C-102']

# 2. 특정 행과 열의 단일 값 선택
grade_104 = df.loc['C-104', '구매등급']  # 결과: 'VIP'

# 3. 여러 행과 열을 동시에 선택 (데이터프레임 반환)
subset_df = df.loc[['C-101', 'C-103'], ['이름', '누적구매액']]

1.3. loc 슬라이싱 주의사항

loc를 사용하여 특정 범위의 데이터를 슬라이싱할 때는 파이썬의 기본 리스트 슬라이싱과 다른 규칙이 적용됩니다. 파이썬 리스트의 a:b 슬라이싱은 b 직전까지 데이터를 가져오지만, 판다스 loc의 명칭 기반 슬라이싱은 마지막 값(b)을 포함합니다.

# 'C-101'부터 'C-103'까지의 행을 모두 포함하여 가져옵니다. (C-103 포함)
print(df.loc['C-101':'C-103'])

2. 위치 정수 기반의 데이터 선택: iloc 속성 이해하기

2.1. iloc의 정의와 특징

iloc는 Integer Location(정수 위치)의 약어로, 정수 위치(Integer Position)로 데이터를 선택합니다. 행이나 열의 명칭과 관계없이, 행과 열의 실제 위치(Position)를 나타내는 0부터 시작하는 정수 번호를 기준으로 데이터를 선택합니다.

기본적인 사용 형식은 df.iloc[행_번호, 열_번호]입니다.

2.2. 비즈니스 예시로 보는 iloc 활용

앞서 정의한 동일한 df 데이터프레임을 기반으로 iloc를 사용해 데이터를 추출해 보겠습니다.

# 1. 첫 번째 행 데이터 선택 (C-101 행)
first_row = df.iloc[0]

# 2. 마지막 행의 두 번째 열 값 선택
# 행 위치는 3 (최지우), 열 위치는 1 (구매등급)
last_grade = df.iloc[3, 1]  # 결과: 'VIP'

# 3. 여러 행과 열을 위치 기반으로 선택
subset_iloc = df.iloc[[0, 2], [0, 2]]

2.3. iloc 슬라이싱 규칙

iloc의 슬라이싱 범위 지정은 정수를 사용하기 때문에 파이썬의 표준 슬라이싱 규칙을 그대로 따릅니다. 즉, start:end로 지정했을 때 end 인덱스 직전(end-1)까지의 데이터만 가져옵니다.

Python

# 행 인덱스 0번부터 2번 직전(1번)까지 선택, 열 인덱스 0번부터 2번 직전(1번)까지 선택
# 즉, 0~1행과 0~1열의 데이터를 가져옵니다.
print(df.iloc[0:2, 0:2])

3. loc와 iloc의 핵심 차이점 요약

두 속성의 차이점을 인지하는 것은 코드의 가독성을 높이고 디버깅 시간을 단축하는 방법입니다. 아래 비교 테이블을 통해 한눈에 정리할 수 있습니다.

구분loc 속성iloc 속성
선택 기준행/열의 명칭(Label)행/열의 정수 위치 번호(Integer)
슬라이싱 범위시작과 끝을 모두 포함 (a:b 지정 시 b 포함)시작은 포함하되 끝은 제외 (a:b 지정 시 b-1까지)
주요 입력 형태문자열 인덱스, 컬럼 이름, 불리언 배열0부터 시작하는 정수, 정수 슬라이싱
가독성 측면컬럼명을 명시하므로 의미 파악이 비교적 명확함정수 위치 정보만 사용하므로 데이터 구조 변화에 약함

4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트

빅데이터분석기사 실기(작업형 제1유형 및 제2유형)에서는 주어지는 데이터셋의 형태와 요구사항에 맞게 인덱싱 방식을 선택해야 합니다.

4.1. 불리언 인덱싱과의 결합 (loc의 유용성)

시험 문제에서 “특정 조건(예: 누적구매액이 10만 원 이상)을 만족하는 고객들의 이름과 구매등급을 추출하시오”와 같은 필터링 요구조건이 자주 출제됩니다. 이때는 불리언 배열을 행 조건으로 활용할 수 있는 loc가 요긴하게 쓰입니다.

# 누적구매액이 100,000원 이상인 고객의 이름과 구매등급 컬럼 선택
target_customers = df.loc[df['누적구매액'] >= 100000, ['이름', '구매등급']]

loc는 조건식과 컬럼 명칭을 동시에 활용할 수 있어 직관적이고 가독성 높은 코드를 작성하는 데 적합합니다.

4.2. 정적 위치 추출 및 데이터 슬라이싱 (iloc의 유용성)

반면, 머신러닝 모델링 단계에서 독립변수(X)와 종속변수(y)를 분리할 때는 열의 이름을 일일이 타이핑하는 것보다 iloc를 활용하는 것이 간편할 수 있습니다.

Python

# 보통 마지막 열에 타겟(y) 변수가 위치하는 경우
X = df.iloc[:, :-1]  # 처음부터 마지막 직전 열까지 선택
y = df.iloc[:, -1]   # 마지막 열만 선택

이 방식은 컬럼명이 한글이거나 복잡한 영어 스펠링으로 이루어져 있어 오타가 발생하기 쉬운 시험 환경에서 코딩 실수를 줄여주는 유용한 접근법이 될 수 있습니다.

5. 요약 및 다음 화 안내

  • loc: 명칭을 기준으로 데이터를 선택하며, 슬라이싱 시 마지막 값(b)을 포함합니다. 조건식(불리언 인덱싱)과 함께 사용하여 특정 조건에 맞는 열만 골라낼 때 자주 활용됩니다.
  • iloc: 컴퓨터가 인식하는 순서(0, 1, 2…)인 정수 번호를 기준으로 작동하며, 슬라이싱 시 마지막 인덱스 직전까지만 포함합니다. 행렬 슬라이싱이나 열의 순서 기반 분할 시 유용합니다.

다음 [판다스 7화]에서는 데이터를 더욱 정밀하게 필터링할 수 있는 심화 기법인 조건으로 데이터 추출하기: Boolean Indexing과 query 함수 활용법에 대해 자세히 다루어 보겠습니다. 판다스의 조건 검색을 고도화하여 원하는 인사이트를 빠르게 도출하는 방법을 배워봅시다.

댓글 남기기