본문 바로가기
Python/Pandas

데이터 인덱싱(loc, iloc, 슬라이싱, 불린인덱싱, at, iat, ix)-pandas(10)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 데이터 인덱싱 방법과 예제


본 포스팅에서는 Series와 DataFrame에 대해 각종 메서드를 이용하여 인덱싱 하는 방법에 대해 다룰 것이다.


 인덱싱


앞 포스팅에서 대괄호 [ ]를 사용하여 데이터 처리에 대한 기초적인 방법을 소개했다.

이 섹션에서는 다양한 방법을 통한 인덱싱 처리방법을 간략히 다룰 것이다. 

각각의 방법에 대한 상세한 사항은 차후에 다룰 예정이다. 


 인덱싱 방법들

아래 표는 pandas에서 처리하는 대표적인 인덱싱 방법을 보여준다. 

별다른 설명이 없다면 Series는 스칼라 값을 인덱싱하고, DataFrame는 행을 인덱싱한다.

  ○ 예를들어, 행을 선택하는 것은 DataFrame의 행에 해당하는 Series를 반환한다.


 이름

 기호

 설명

 대괄호

 [ ] 

 레이블이나 위치 정수를 활용하여 인덱싱을 한다.

 레이블 인덱싱

 .loc[label]

 레이블을 기반으로 인덱싱을 한다.

 위치 인덱싱

 .iloc[position]

 위치 정수를 기반으로 인덱싱을 한다.

 슬라이싱 

 [ : ]

 슬라이싱을 활용하여 인덱싱을 한다.

 불린 인덱싱

 [ bool_vec ] 

 불린 벡터를 활용하여 인덱싱을 한다.

   ○ 불린 연산(<, >, ==, != 등)을 활용하여 조건이 참인 값들을 인덱싱한다.

   ○ Series에 적용시 Series를 반환한다. 

   ○ DataFrame에 적용시 DataFrame을 반환한다. 

 레이블 인덱싱

 .at[label]

 레이블을 기반으로 인덱싱을 한다.

   ○ DataFrame과 Series 상관없이 하나의 스칼라값에 접근한다.

 위치 인덱싱

 .iat[position]

 위치 정수를 기반으로 인덱싱을 한다.

   ○ DataFrame과 Series 상관없이 하나의 스칼라값에 접근한다.

 .ix 인덱서

 .ix[ ]

 레이블이나 위치 정수를 활용하여 인덱싱을 한다.
   ○ 레이블과 위치정수 둘 다 사용할 수는 있다.

   ○ 유용할 것 같지만 둘 다 사용할 수 있다는 점 때문에 혼선이 생길 가능성이 높아지므로 사용은 지양된다.



참고사항(대괄호 [ ]와 .loc, .iloc 메서드의 차이)

  앞 포스팅에서 다루었던 대괄호[ ]는 레이블을 이용하여 열(column)을 선택하였다. 

  하지만 .loc, .iloc메서드는 행을 선택하며, DataFrame에서는 튜플을 이용해 하나의 요소도 선택이 가능하다. 




 각 인덱싱에 대한 사용 예제


이전 포스팅에서 대괄호를 이용하여 인덱싱 및 데이터 처리법에 대해 다루었으므로 본 포스팅에서는 대괄호에 대한 예제는 다루지 않는다. 

각 메서드에 대한 상세사항은 추후 포스팅에서 다루도록 하고 본 포스팅에서는 간단한 사용 예를 다뤄보도록 한다.



 레이블을 이용한 인덱싱 .loc 사용 예

.loc 메서드는 레이블을 기반으로 데이터에 접근한다.

따라서 정수가 아니라 반드시 레이블을 입력하여야 한다.

다음은 .loc 메서드를 사용한 예제이다. 


.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

Out[5]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


In[6]: ex_df.loc['r1']       # 행에 대한 접근

Out[6]: 

c0    3

c1    4

c2    5

Name: r1, dtype: int64


In[7]: ex_df.loc['r1', 'c0']  # 하나의 요소에 대한 접근

Out[7]: 3




 위치 정수를 이용한 인덱싱 .iloc 사용 예

.iloc 메서드는 위치 정수를 이용하여 데이터에 접근한다. 

따라서 반드시 정수를 입력하여야 한다.

다음은 .iloc 메서드를 사용한 예제이다.


.iloc 메서드 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# .iloc메서드 사용 예

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

Out[9]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


In[10]: ex_df.iloc[1]       # 행에 대한 접근

Out[10]: 

c0    3

c1    4

c2    5

Name: r1, dtype: int64


In[11]: ex_df.iloc[1, 2]     # 하나의 요소에 접근

Out[11]: 5




 슬라이싱[ : ] 사용 예

파이썬에서 제공하는 슬라이싱을 pandas에서도 사용할 수 있다.

다음은 슬라이싱을 사용한 예제이다.


슬라이싱 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame 생성

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

In[13]: ex_df

Out[13]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# .loc 메서드 슬라이싱

In[14]: ex_df.loc['r0':'r1','c1':'c2']

Out[14]: 

    c1  c2

r0   1   2

r1   4   5


# .iloc 메서드 슬라이싱

In[15]: ex_df.iloc[ : ,1:2]

Out[15]: 

    c1

r0   1

r1   4

r2   7


# 대괄호 [ ] 슬라이싱

In[16]: ex_df['r1':'r2']

Out[16]: 

    c0  c1  c2

r1   3   4   5

r2   6   7   8


참고사항(loc, iloc 메서드의 차이)

  .loc 메서드는 레이블을 기반으로 데이터에 접근한다.

  .iloc 메서드는 위치 정수를 기반으로 데이터에 접근한다.



 불린 인덱싱 사용 예

pandas에서는 불린 인덱싱을 이용하여 특정 조건에 맞는 데이터만 추출하는 것이 가능하다.

다음은 불린 인덱싱을 사용한 예제이다.


불린 인덱싱 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame 생성

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

In[18]: ex_df

Out[18]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# 불린 인덱싱 예제

In[19]: ex_df[ex_df%2 ==0]

Out[19]: 

     c0   c1   c2

r0  0.0  NaN  2.0

r1  NaN  4.0  NaN

r2  6.0  NaN  8.0



 레이블을 이용한 인덱싱 .at 사용 예

.loc 메서드와 마찬가지로 레이블을 통해 데이터에 접근한다.

.loc 메서드는 하나의 행에도 접근이 가능했다. 

하지만 이 메서드는 .loc와는 다르게 하나의 요소에만 접근할 수 있다.


.at 메서드 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame 생성

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

In[21]: ex_df

Out[21]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# 불린 인덱싱 예제

In[22]: ex_df.at['r2','c0']

Out[22]: 6




 위치 정수를 이용한 인덱싱 .iat 사용 예

.iloc 메서드와 마찬가지로 위치정수 통해 데이터에 접근한다.

.iloc 메서드는 하나의 행에도 접근이 가능했다. 

하지만 이 메서드는 .iloc와는 다르게 하나의 요소에만 접근할 수 있다.


.iat 메서드 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame 생성

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

In[24]: ex_df

Out[24]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# 불린 인덱싱 예제

In[25]: ex_df.iat[0, 1]

Out[25]: 1



 .ix 인덱서 사용 예

.ix 인덱서는 레이블과 위치정수 둘 다 사용하여 데이터에 접근이 가능하다.

즉, .loc 및 .iloc 메서드를 합쳐놨다고 봐도 무방하다.



불린 인덱싱 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 DataFrame 생성

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

In[27]: ex_df

Out[27]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8


# 불린 인덱싱 예제

In[28]: ex_df.ix[0]

Out[28]: 

c0    0

c1    1

c2    2

Name: r0, dtype: int64


In[29]: ex_df.ix['r2']

Out[29]: 

c0    6

c1    7

c2    8

Name: r2, dtype: int64



주의사항

  .ix 인덱서는 레이블과 위치정수를 둘 다 사용할 수 있다는 장점이 있다.

  하지만, 둘 다 사용할 수 있다는 것은 혼동을 일으키기 쉽다는 단점이 있기 때문에, 사용하는 것은 지양된다.

  그리고, 0.25.1 버전 기준으로 사용 시 사용하지 말라고 경고가 뜬다.




 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html

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

 

 

 

 



반응형

댓글