PYTHON/etc contents

데이터프레임 사용하기 - iloc, loc

  • -

지난 게시글에서는 데이터프레임을 제작하는 방법에 대해 알아보았으니, 이번 게시글에서는 데이터프레임 안에 입력되어 있는 데이터에 접근하는 방법을 살펴보도록 하자. 데이터에 접근하는 방법으로는 크게 iloc과 loc이 있다. 지난 시간에 제작했던 데이터프레임 자료는 아래와 같다.

인덱스 번호 칼럼 1(열 1) 칼럼 2(열 2) 칼럼 3(열 3) 칼럼 4(열 4)
행 1 a b c d
행 2 g h i j
행 3 m n o p
행 4 s t u v

데이터에 접근하는 방법 중 iloc은 주로 인덱스 번호를 통해 데이터에 접근하고, loc은 칼럼명을 통해 데이터에 접근한다고 설명하는 게시글들이 많아서 본인도 처음에는 수많은 차이점이 있을 줄 알았는데, 막상 여러 번 사용해보니 딱히 그렇지도 않았다.

 

데이터 접근 방법 (1) : iloc

iloc은 인덱스 번호, 즉 행 번호를 기반으로 데이터를 불러오는 역할을 수행한다. 다만 주의해야 할 점은 행 1의 인덱스 번호는 0번이라는 것이다. 아래의 출력 결과에서 맨 왼쪽에 입력되어 있는 0, 1, 2, 3이 바로 인덱스 번호가 되며, iloc을 통해 값에 접근할 경우에는 각각 .iloc[0] 또는 .iloc[1]과 같이 사용한다. 

  columns1 columns2 columns3 columns4
0        a        b        c        d
1        g        h        i        j
2        m        n        o        p
3        s        t        u        v

 

위의 데이터가 입력되어 있는 변수가 result라고 했을 때, 인덱스 번호가 0인 행에 접근하는 코드는 result.iloc[0]이다.

result.iloc[0]

## 출력 결과 ##
columns1    a
columns2    b
columns3    c
columns4    d
Name: 0, dtype: object

 

 

데이터 접근 방법 (2) : loc

다음으로 loc을 통한 데이터 접근 방법이다. 사실 인덱스를 통한 데이터 접근 방법과 그 출력 결과는 iloc이나 loc이나 차이점이 없다. 아래의 예시를 보도록 하자.

result['columns1'].loc[0]
## 출력 결과 ## 
'a'

result['columns1'].iloc[0]
## 출력 결과 ##
'a'

 

다만 loc은 주로 칼럼명이나 행 이름과 함께 사용하는데, 이 경우 행 이름이 없으므로 그 부분은 제외하도록 하고 칼럼명을 통해 데이터에 접근하는 방법을 살펴보도록 하자.  아래의 모습을 보면 알겠지만, loc의 경우에는 칼럼명을 입력하면 그 값을 잘 얻어오지만 iloc의 경우에는 그 값을 얻어오지 못한다.

result.loc[0, 'columns2']
## 출력 결과 ##
'b'


result.iloc[0, 'columns2']
## 출력 결과 ##
Traceback (most recent call last):
  File "C:\anaconda\envs\py36\lib\site-packages\pandas\core\indexing.py", line 702, in _has_valid_tuple
    self._validate_key(k, i)
  File "C:\anaconda\envs\py36\lib\site-packages\pandas\core\indexing.py", line 1369, in _validate_key
    raise ValueError(f"Can only index by location with a [{self._valid_types}]")
ValueError: Can only index by location with a [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array]
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\anaconda\envs\py36\lib\site-packages\pandas\core\indexing.py", line 873, in __getitem__
    return self._getitem_tuple(key)
  File "C:\anaconda\envs\py36\lib\site-packages\pandas\core\indexing.py", line 1443, in _getitem_tuple
    self._has_valid_tuple(tup)
  File "C:\anaconda\envs\py36\lib\site-packages\pandas\core\indexing.py", line 707, in _has_valid_tuple
    ) from err
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types

 

하지만 바로 위에서 사용했던 방법처럼   []  (대괄호)  안에 인덱스 번호와 칼럼명을 함께 사용하는 경우가 아니라면 iloc과 loc의 차이점은 없다고 본다. 따라서 본인은 단순하게 아래와 같이 iloc이든 loc이든 별 구분 없이 사용한다. 

result['columns1'].loc[0]
## 출력 결과 ##
'a'

result['columns1'].iloc[0]
## 출력 결과 ##
'a'

 

 


728x90

 

 

아니 그래도 따로 만든 이유가 있을 거 아니야?

평상시엔 둘 간의 구분을 거의 두지 않고   변수값['칼럼명'].iloc or loc  과 같은 형태로 사용하지만, 사용하는 데에 있어서 주의해야 할 부분이 딱 하나 있다. 바로 몇 번째 인덱스 번호부터 몇 번째 인덱스 번호까지의 데이터를 불러오는 과정에서는 차이점이 있다는 것이다. 

결론부터 말하자면 loc의 경우에는 [0:2]를 사용하게 되면 인덱스 번호가 0, 1, 2인 세 개의 값을 얻어오지만 iloc[0:2]를 사용하게 될 경우에는 인덱스 번호가 0, 1인 두 개의 값을 얻어온다. 

>>> result.loc[0:2]
columns1 columns2 columns3 columns4
0        a        b        c        d
1        g        h        i        j
2        m        n        o        p


>>> result.iloc[0:2]
columns1 columns2 columns3 columns4
0        a        b        c        d
1        g        h        i        j

 

그렇다면 앞서 본인의 경우에는 iloc이든 loc이든 상관 없이   변수['칼럼명']  과 같은 형태를 사용한다고 했는데, 이 경우에도 iloc과 loc 간에 차이점이 존재하는지 한번 확인해보자.  

>>> result['columns1'].loc[0:2]
0    a
1    g
2    m
Name: columns1, dtype: object

>>> result['columns1'].iloc[0:2]
0    a
1    g
Name: columns1, dtype: object

 

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.