본문 바로가기
Python/Pandas

.loc 메서드(레이블)를 이용한 인덱싱과 슬라이싱-pandas(11)

by 콩돌 2019. 10. 20.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 .loc 메서드(레이블)를 이용한 인덱싱


본 포스팅에서는 .loc 메서드에 대해 좀 더 상세히 알아볼 것이며, 이 메서드를 이용한 인덱싱에 대해 살펴볼 것이다.



 .loc 메서드에 대한 설명


.loc 메서드는 기본적으로 레이블(label)을 사용하여 행에 접근하는 메서드이다.

   .loc 메서드에 정수를 입력할 경우 에러가 발생한다.



 .loc 메서드의 특징

.loc 메서드에 대한 특징은 다음과 같다. 

  ○ 순수한 레이블 기반 인덱싱이다.

    ▷ 정수 역시 사용이 가능은 하나, 레이블이 정수일 경우에만 그렇다. (자세한 내용 예제참고)

  ○ 불린 배열(boolean array)과 함께 사용될 수 있다. 

  ○ .loc는 해당 객체를 찾을 수 없을 경우 KeyError를 발생시킨다.

  ○ 슬라이싱 할 경우 슬라이싱 시작 요소와 끝 요소 둘 다 포함하여 결과를 반환한다. 



 .loc 메서드의 사용법

.loc 메서드는 .loc 뒤에 대괄호를 붙여 사용한다. 

구문 형식은 다음과 같다.


.loc 메서드의 기본적인 구문 형식)

# Series에서의 사용

  Series.loc[ 'index_label' ]  # Series에서의 요소 선택 


# DataFrame에서의 사용

  DataFrame.loc[ 'index_label' ]                         # 행의 선택 

  DataFrame.loc[ 'index_label', 'column_label'  ]   # 하나의 요소 선택 


'index_label'은 행을 선택하기 위한 인덱스의 레이블을 의미한다.

'column_label'은 행 선택 이후 해당 행에서 요소를 선택하기 위한 열의 레이블을 의미한다.

각 변수 위치에 슬라이싱을 입력해도 유효하다.


①은 Series에서 데이터를 선택하는 형식이며 하나의 요소를 반환한다.

②은 DataFrame에서 데이터를 선택하는 형식이며 행에 해당하는 Series를 반환한다.

③은 DataFrame에서 데이터를 선택하는 형식이며, 열의 레이블을 입력함으로써 하나의 요소를 선택하여 반환한다.



 .loc 메서드의 입력 자료형

.loc에 사용 가능한 입력 자료형으로는 다음과 같다.

   하나의 레이블(예: 5, 'a' 등) 

    ▷ 여기서는 5는 레이블의 인덱스를 의미하며, 위치 정수를 의미하는 것이 아니다. 

        (아래 정수 레이블을 이용한 데이터 선택 섹션에 예제가 있으니 참고하자.)

    ▷ index 객체에 정수형태로 입력이 되어있을 레이블이 이름이 정수 5인 위치를 의미한다.

   레이블의 리스트(list) (예: ['a', 'b', 'c'] )

   레이블의 슬라이스 객체 (예: 'a':'f')

   불린 배열(boolean array) (예: [True, False])

   callable 함수

    ▷ 하나의 입력변수를 활용하고 인덱스에 대한 명확한 출력을 반환하여야 한다.


대괄호 .loc, .iloc, .ix 메서드의 차이

  .loc 메서드는 레이블을 이용하여 행을 선택하며,

    ▷ 슬라이싱을 할 경우 처음과 끝이 둘 다 포함된다.

  .iloc메서드는 위치 정수를 이용하여 행을 선택한다.

    ▷ 슬라이싱을 할 경우 처음은 포함되나 끝 요소는 포함이 되지 않는다.

  공통점으로는 둘 다 불린 배열(boolean array)를 이용한 인덱싱이 가능하다.

  .ix 메서드는 레이블과 위치정수 둘 다 사용이 가능한 메서드이다.

    ▷ 단, 사용하는 것은 지양된다.



 .loc 사용 예


이 섹션에서는 각 방식에 따른 예제를 보여줄 것이다.


 행의 선택

아래는 하나의 인덱스 레이블을 이용하여 행을 선택한 예이다.


행의 선택 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# .loc메서드를 사용하여 행을 선택하는 예

In[4]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[5]: ex_df.loc['r1']

Out[5]: 

c0    3

c1    4

c2    5

Name: r1, dtype: int64



 DataFrame에서의 하나의 요소 선택

아래 예제는 인덱스 레이블과 열의 레이블을 이용하여 하나의 요소를 선택하는 예제이다.


요소 선택 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 하나의 요소 선택 예

In[6]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[7]: ex_df.loc['r1', 'c2']

Out[7]: 5



 슬라이싱을 이용한 선택

다음 예제는 슬라이싱을 사용하여 선택을 하는 예제이다.

슬라이싱에 입력된 처음과 끝 요소 중 하나의 요소가 레이블에 없는 값이 입력된 경우에는,

   인덱스가 정렬될 수 있다면, 입력된 시작 끝 슬라이싱에 비교하고 rank에 의해 예상되는 값들을 반환한다. 

   인덱스가 정렬이 되지 않으면 에러가 발생한다. 

    ▷ 이 경우 계산 비용이 많이 들고 혼합 유형 인덱스의 경우 잠재적으로 모호하기 때문에 에러를 발생시킨다.

    ▷ 예를들어 아래의 예제에서 [1:6]인경우는 KeyError가 발생한다. 


슬라이싱을 이용한 선택 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 인덱스의 슬라이싱 사용 예

In[8]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[9]: ex_df.loc['r1':'r2', :'c1']

Out[9]: 

    c0  c1

r1   3   4

r2   6   7


# 인덱싱 정렬을 통한 예상값 반환 예

In[10]: ex_df['r0':'r0.5']

Out[10]: 

    c0  c1  c2

r0   0   1   2



 불린 배열을 이용한 데이터 선택

아래 예제는 불린 인덱싱을 사용하여 데이터를 선택하는 예제이다. 


불린 배열 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 인덱스의 불린 배열 사용 예

In[11]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[12]: ex_df.loc[[True, False, True]]

Out[12]: 

    c0  c1  c2

r0   0   1   2

r2   6   7   8


인덱스와 열의 불린 배열 예

In[13]:ex_df.loc[[True, False, True], [True, False, True]]

Out[13]: 

    c0  c2

r0   0   2

r2   6   8



 callable 함수를 이용한 데이터 선택

다음 예제는 람다 표현식을 이용하여 데이터를 선택하는 예제이다.

다음 예제에서 보여주는 것과 같이 함수를 사용하여 필요한 데이터를 선택하는 것이 가능하다.


람다표현식 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame와 람다표현식의 설정

In[14]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[15]: x= lambda x: 'r'+str(x)


# 람다표현식 사용을 통한 인덱싱 설정

In[16]: ex_df.loc[x(0)]

Out[16]: 

c0    0

c1    1

c2    2

Name: r0, dtype: int64



 정수 레이블을 이용한 데이터 선택

다음 예제는 정수 레이블을 이용한 데이터의 선택 예제이다.

예제에서 처럼 정수로도 레이블을 설정하는것이 가능하다.

iloc 메서드를 사용하여 데이터를 선택하는 것과 다르다.

   .loc 메서드는 정수로 만들어진 레이블을 따르고, iloc 메서드에서 정수는 위치를 따르기 때문이다.


정수형의 레이블의 선택 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# .loc메서드 사용 예

In[17]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=[2,1,0], columns=[2,1,0])

In[18]: ex_df.loc[2]

Out[18]: 

2    0

1    1

0    2

Name: 2, dtype: int64


In[19]: ex_df.loc[2,2]

Out[19]: 0


# .iloc메서드의 정수 인덱싱

In[20]: ex_df.iloc[2]

Out[20]: 

2    6

1    7

0    8

Name: 0, dtype: int64


In[21]: ex_df.iloc[2,2]

Out[21]: 8



 .loc 메서드를 이용한 배정

.loc를 사용하여 데이터를 선택하는 것 뿐만이 아니라 배정까지 가능하다.

행에 대한 배정, 요소 하나에 대한 배정, 슬라이싱을 이용한 배정 모두 유효하다. 


행의 선택 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 행에 대한 배정 예

In[22]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])

In[23]: ex_df.loc['r0']=[9,9,9]     # ex_df.loc['r0']=9 와도 동등하다.

In[24]: ex_df

Out[24]: 

    c0  c1  c2

r0   9   9   9

r1   3   4   5

r2   6   7   8


# 요소에 대한 배정 예

In[25]: ex_df.loc['r1','c1']=5800

In[26]: ex_df

Out[26]: 

    c0    c1  c2

r0   9     9   9

r1   3  5800   5

r2   6     7   8


# 슬라이싱 배정 예

In[27]: ex_df.loc['r1':,'c1':]=9400

In[28]: ex_df

Out[28]: 

    c0    c1    c2

r0   9     9     9

r1   3  9400  9400

r2   6  9400  9400


In[29]: ex_df.loc['r1':,'c1':]=[[9400, 9401], [9402, 9402]]

In[30]: ex_df

Out[30]: 

    c0    c1    c2

r0   9     9     9

r1   3  9400  9401

r2   6  9402  9402



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html  

 

 

 

 



반응형

댓글