Python/NumPy | Pandas

[Python] Pandas - 데이터프레임 고급 인덱싱 1

비번변경 2022. 12. 17. 23:23

인덱싱

DataFrame에서 특정 데이터를 골라내는 것

Pandas에서는 2차원 인덱싱을 지원하기 위해 라벨, 라벨 리스트, 슬라이싱을 통해 인덱싱을 할 수 있을 뿐만 아니라 loc, iloc라는 인덱서를 제공한다.

 

이 글에서는 loc 인덱서에 대해 정리한다.

 

loc

라벨 값을 기반으로 2차원 인덱싱하며 아래와 같이 사용할 수 있다.

df.loc[행 인덱스]
df.loc[행 인덱스, 열 인덱스]

인덱스는 아래와 같은 값이 올 수 있다.

  • 인덱스 데이터
  • 슬라이스
  • 리스트
  • boolean series
  • 인덱스 데이터, 슬라이스, 리스트, boolean series를 반환하는 함수

 

 

예시

아래 DataFrame을 예시로 하여 정리한다.

df = pd.DataFrame(np.arange(10, 22).reshape(3, 4),
                  index=["a", "b", "c"],
                  columns=["A", "B", "C", "D"])
df

# 실행 결과
    A   B   C   D
a  10  11  12  13
b  14  15  16  17
c  18  19  20  21

 

인덱싱 값이 하나인 경우

전달한 인덱스에 해당하는 행을 선택해 시리즈로 반환한다.

df.loc['b']

# 실행 결과
A    14
B    15
C    16
D    17

 

슬라이싱도 할 수 있으며, 이 경우 loc를 쓰지 않았을 때와 동일하다.

df.loc['a':'b']
df['a':'b']

# 실행 결과
    A   B   C   D
a  10  11  12  13
b  14  15  16  17

    A   B   C   D
a  10  11  12  13
b  14  15  16  17

 

인덱스를 리스트로 전달할 수도 있다.

df.loc[['a','b']]

# 실행 결과
    A   B   C   D
a  10  11  12  13
b  14  15  16  17

 

boolean series로 조건에 맞는 행만 선택할 수 있다.

df.A > 15
df.loc[df.A > 15]

# 실행 결과
a    False
b    False
c     True
Name: A, dtype: bool

    A   B   C   D
c  18  19  20  21

 

인덱스 대신 인덱스를 반환하는 함수를 사용할 수 있다.

def select_rows(df):
    return df.A > 15

df[select_rows(df)]

# 실행 결과
    A   B   C   D
c  18  19  20  21

 

행, 열 모두 인덱스를 받는 경우

단일 값을 지정할 때는 아래와 같이 사용한다.

df.loc['a', 'A']

# 실행 결과
10

 

행, 열 모두 슬라이싱을 하거나 리스트를 사용할 수 있다.

df.loc['b':, 'A']
df.loc[["a", "b"], ["B", "D"]]

# 실행 결과
b    14
c    18
Name: A, dtype: int32

    B   D
a  11  13
b  15  17

 

행 인덱스가 boolean series거나 boolean series를 반환하는 함수가 될 수도 있다.

def select_rows(df):
    return df.A > 15

df.loc[select_rows(df), ['C', 'D']]

# 실행 결과
    C   D
c  20  21

 

 

참고 문서

데이터 사이언스 스쿨 - 4.3 데이터프레임 고급 인덱싱