PYTHON 엑셀

[ 판다스(Pandas) ] 데이터 접근 함수 가이드: iloc, loc, at, iat 총정리

나루하루001 2025. 5. 16. 23:23
반응형

 

판다스 데이터 접근 함수 소개

 

판다스(Pandas)는 데이터 분석을 위한 파이썬 라이브러리로,

효율적인 데이터 처리를 위한 다양한 함수를 제공합니다.

 

그 중에서도 데이터프레임(DataFrame)이나

시리즈(Series)의 특정 데이터에 접근하기 위한 함수들은

데이터 분석 작업에서 매우 중요합니다.

 

판다스에서는 iloc, loc, at, iat 네 가지 주요 인덱싱 함수를 제공하며,

각각의 함수는 서로 다른 방식으로 데이터에 접근합니다.

 

이 함수들은 사용 목적과 성능 특성에 따라 적절히 선택하여 사용해야 합니다.

특히 대용량 데이터를 다룰 때는 적절한 인덱싱 방법 선택이 처리 속도에 큰 영향을 미칩니다.

📌 알아두세요!
판다스의 인덱싱 함수들은 크게 두 가지 기준으로 나눌 수 있습니다:
1. 위치 기반(iloc, iat): 정수 인덱스로 접근
2. 라벨 기반(loc, at): 인덱스 이름으로 접근
또한 단일 값 접근(at, iat)과 다중 값 접근(loc, iloc)으로도 구분됩니다.

 

iloc 함수 상세 설명

 

iloc은 "integer location"의 약자로, 정수 위치 기반 인덱싱을 수행합니다.

데이터프레임이나 시리즈의 행과 열을 정수 인덱스(0부터 시작)로 접근할 수 있게 해줍니다.

 

iloc 기본 문법

# 단일 행 접근
df.iloc[0]  # 첫 번째 행 반환

# 단일 값 접근
df.iloc[0, 0]  # 첫 번째 행, 첫 번째 열의 값 반환

# 여러 행 접근
df.iloc[0:3]  # 0, 1, 2번 행 반환

# 여러 행, 여러 열 접근
df.iloc[0:3, 1:3]  # 0~2행, 1~2열 반환

# 불연속적인 행/열 접근
df.iloc[[0, 2, 5], [1, 3]]  # 0, 2, 5행의 1, 3열 반환

 

iloc은 정수 위치 기반이기 때문에 인덱스 이름이 아닌

위치로만 접근이 가능합니다.

 

따라서 데이터프레임의 인덱스가 문자열이나 날짜 등으로 설정되어 있더라도,

iloc은 항상 0부터 시작하는 정수 위치로 데이터에 접근합니다.

🔍 주의사항
iloc에서는 슬라이싱 시 마지막 인덱스가 포함되지 않습니다.
df.iloc[0:3]은 0, 1, 2행을 반환하고 3행은 포함되지 않습니다.

 

반응형

loc 함수 상세 설명

 

loc은 "location"의 약자로,

라벨(인덱스 이름) 기반 인덱싱을 수행합니다.

 

데이터프레임이나 시리즈의 행과 열을 인덱스 이름으로 접근할 수 있게 해줍니다.

 

loc 기본 문법

# 단일 행 접근
df.loc['index_name']  # 'index_name'이라는 인덱스를 가진 행 반환

# 단일 값 접근
df.loc['index_name', 'column_name']  # 특정 인덱스와 컬럼의 교차점 값 반환

# 여러 행 접근
df.loc['index1':'index3']  # 'index1'부터 'index3'까지의 행 반환

# 여러 행, 여러 열 접근
df.loc['index1':'index3', 'col1':'col3']  # 지정된 행과 열의 부분집합 반환

# 불연속적인 행/열 접근
df.loc[['index1', 'index5'], ['col1', 'col4']]  # 지정된 인덱스와 컬럼의 값 반환

# 불리언 인덱싱
df.loc[df['column'] > 5]  # 조건을 만족하는 행만 반환

loc은 라벨 기반이므로 인덱스 이름으로 접근합니다. 정수 인덱스를 사용하는 경우에도 위치가 아닌 인덱스 값으로 해석됩니다. 또한 loc은 불리언 마스킹(boolean masking)을 통한 조건부 필터링에도 자주 사용됩니다.

🔍 주의사항
loc에서는 슬라이싱 시 마지막 인덱스도 포함됩니다.
df.loc['A':'C']는 인덱스가 'A', 'B', 'C'인 행을 모두 포함합니다.

 

at 함수 상세 설명

 

at은 라벨(인덱스 이름) 기반으로 단일 값에 빠르게 접근하기 위한 함수입니다. loc과 유사하지만 오직 단일 스칼라 값에만 접근할 수 있으며, 그 대신 더 빠른 성능을 제공합니다.

 

at 기본 문법

# 단일 값 접근
value = df.at['index_name', 'column_name']

# 값 수정
df.at['index_name', 'column_name'] = new_value

 

at은 단일 값에 대한 접근과 수정에 최적화되어 있어,

대량의 단일 값 접근 작업에서 loc보다 훨씬 빠른 성능을 보입니다.

 

특히 반복문 내에서 데이터프레임의 특정 셀에 자주 접근해야 하는 경우

at을 사용하면 성능 향상을 기대할 수 있습니다.

 

iat 함수 상세 설명

 

iat은 "integer at"의 약자로,

정수 위치 기반으로 단일 값에 빠르게 접근하기 위한 함수입니다.

 

iloc과 유사하지만 오직 단일 스칼라 값에만 접근할 수 있으며,

더 빠른 성능을 제공합니다.

 

iat 기본 문법

# 단일 값 접근
value = df.iat[0, 0]  # 첫 번째 행, 첫 번째 열의 값 반환

# 값 수정
df.iat[0, 0] = new_value  # 첫 번째 행, 첫 번째 열의 값 수정

 

iat은 정수 위치 기반으로 단일 값에 접근하므로,

인덱스 이름이 아닌 위치(0부터 시작)로 접근해야 합니다.

 

대량의 단일 값 접근 작업에서 iloc보다 훨씬 빠른 성능을 보이며,

특히 반복문 내에서 데이터프레임의 특정 셀에 자주 접근해야 하는 경우 유용합니다.

 

함수 간 성능 비교

 

판다스의 인덱싱 함수들은 사용 목적과 상황에 따라 성능 차이가 있습니다.

 

일반적으로 단일 값 접근 시에는 at과 iat이 loc과 iloc보다 빠르며,

여러 값을 한 번에 접근할 때는 loc과 iloc을 사용해야 합니다.

 

함수별 특징 비교

함수 접근 방식 다중 값 접근 단일 값 접근 상대적 속도
loc 라벨 기반 가능 가능 중간
iloc 위치 기반 가능 가능 중간
at 라벨 기반 불가능 가능 빠름
iat 위치 기반 불가능 가능 가장 빠름

 

성능 테스트 결과에 따르면, 단일 값 접근 시 iat이 가장 빠르고,

그 다음으로 at, iloc, loc 순서로 빠릅니다.

 

특히 대용량 데이터셋에서 반복적인 접근이 필요한 경우 at과 iat의 성능 이점이 더욱 두드러집니다.

💡 성능 팁
- 단일 값에 자주 접근하는 경우: at 또는 iat 사용
- 여러 행/열에 접근하는 경우: loc 또는 iloc 사용
- 인덱스가 문자열인 경우: loc 또는 at 사용
- 위치 기반 접근이 필요한 경우: iloc 또는 iat 사용

 

실전 활용 예제

 

다음은 판다스의 인덱싱 함수들을 실제로 활용하는 예제입니다.

 

예제 데이터프레임 생성

 

import pandas as pd
import numpy as np

# 샘플 데이터프레임 생성
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
}, index=['r1', 'r2', 'r3', 'r4', 'r5'])

print(df)

 

실행 결과:

    A   B    C
r1  1  10  100
r2  2  20  200
r3  3  30  300
r4  4  40  400
r5  5  50  500

 

 

iloc 활용 예제

# 첫 번째 행 선택
print(df.iloc[0])

# 첫 번째와 세 번째 행 선택
print(df.iloc[[0, 2]])

# 처음 3개 행, 처음 2개 열 선택
print(df.iloc[0:3, 0:2])

# 특정 위치의 값 선택
print(df.iloc[1, 2])  # 두 번째 행, 세 번째 열의 값

 

 

loc 활용 예제

# 인덱스 이름으로 행 선택
print(df.loc['r1'])

# 여러 인덱스 선택
print(df.loc[['r1', 'r3']])

# 인덱스 범위와 열 이름으로 선택
print(df.loc['r1':'r3', 'A':'B'])

# 조건을 만족하는 행 선택
print(df.loc[df['A'] > 2])

 

at과 iat 활용 예제

# at으로 단일 값 접근
print(df.at['r2', 'B'])  # 20

# iat으로 단일 값 접근
print(df.iat[1, 1])  # 20

# 값 수정
df.at['r1', 'A'] = 100
df.iat[0, 2] = 999

print(df)

실행 결과:

      A   B    C
r1  100  10  999
r2    2  20  200
r3    3  30  300
r4    4  40  400
r5    5  50  500

 

성능 비교 예제

import time

# 대용량 데이터프레임 생성
large_df = pd.DataFrame(np.random.randn(10000, 100))

# loc vs at 성능 비교
start = time.time()
for i in range(1000):
    _ = large_df.loc[5000, 50]
print(f"loc 실행 시간: {time.time() - start:.6f}초")

start = time.time()
for i in range(1000):
    _ = large_df.at[5000, 50]
print(f"at 실행 시간: {time.time() - start:.6f}초")

# iloc vs iat 성능 비교
start = time.time()
for i in range(1000):
    _ = large_df.iloc[5000, 50]
print(f"iloc 실행 시간: {time.time() - start:.6f}초")

start = time.time()
for i in range(1000):
    _ = large_df.iat[5000, 50]
print(f"iat 실행 시간: {time.time() - start:.6f}초")

 

실행 결과 예시:

loc 실행 시간: 0.123456초
at 실행 시간: 0.034567초
iloc 실행 시간: 0.098765초
iat 실행 시간: 0.023456초

 

이 결과에서 볼 수 있듯이,

단일 값 접근에서는 at과 iat이

loc과 iloc보다 훨씬 빠른 성능을 보입니다.

 

결론 및 요약

 

판다스의 데이터 접근 함수들은 각각 고유한 특징과 용도를 가지고 있습니다:

 

1. iloc: 정수 위치 기반으로 여러 행/열에 접근할 때 사용합니다.

2. loc: 라벨 기반으로 여러 행/열에 접근하거나 조건부 필터링에 사용합니다.

3. at: 라벨 기반으로 단일 값에 빠르게 접근할 때 사용합니다.

4. iat: 정수 위치 기반으로 단일 값에 가장 빠르게 접근할 때 사용합니다.

 

데이터 분석 작업에서는 상황에 맞는 적절한 함수를 선택하는 것이 중요합니다.

대용량 데이터셋을 다룰 때는 특히 성능 차이가 크게 나타나므로,

단일 값 접근이 필요한 경우 at이나 iat을 사용하고,

여러 값을 한 번에 다룰 때는 loc이나 iloc을 사용하는 것이 좋습니다.

 

또한 인덱스의 특성에 따라 라벨 기반(loc, at)과 위치 기반(iloc, iat) 함수를 적절히 선택하면

코드의 가독성과 성능을 모두 향상시킬 수 있습니다.

📝 최종 정리
- 여러 행/열 접근: loc(라벨 기반), iloc(위치 기반)
- 단일 값 접근: at(라벨 기반), iat(위치 기반)
- 성능: iat > at > iloc > loc
- 조건부 필터링: loc 사용
- 반복문에서 단일 값 접근 시: at 또는 iat 사용
반응형