파이썬 버전 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 |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
.ix 메서드를 이용한 인덱싱-pandas(13) (0) | 2019.10.22 |
---|---|
.iloc 메서드(정수 위치)를 이용한 인덱싱과 슬라이싱-pandas(12) (0) | 2019.10.21 |
데이터 인덱싱(loc, iloc, 슬라이싱, 불린인덱싱, at, iat, ix)-pandas(10) (0) | 2019.10.19 |
데이터 및 열 선택, 배정, 추가, 인덱싱, pop 및 insert 메서드-pandas(9) (0) | 2019.10.18 |
데이터 추출(array, to_numpy, values)-pandas(8) (0) | 2019.10.17 |
댓글