iloc, loc를 사용한 행/열 선택법 from Pandas df

2019. 9. 15. 10:41Programming Tutorial/Python

Pandas DataFrame에서 특정 행/열을 선택하는 방법은 여러가지가 있습니다.

단연코 Pandas를 사용하면서 이러한 선택의 기로에 많이 놓이게 됩니다. 어떤 방법을 써야될지 혼동이 오는 경우가 참 많죠.

 

" 역시 반복 밖에 없나봅니다."

 

자 시작해보겠습니다.

 

일단 방법은 크게 2가지입니다.

 

1. 행번호(row number)로 선택하는 방법 (.iloc)

2. label이나 조건표현으로 선택하는 방법 (.loc)

 

 


1. 행번호(row number)로 선택하는 방법(.iloc)

 

 조금 혼동이 있을수 있을수 있어 간단하게 다시 표현하면

 

   " 행이든 열이든 숫자로 location을 나타내서 Selecting or indexing 하는 방법입니다."

 

 상상을 조금 해봅시다. row number가 0부터 전체 row 수까지 있죠.

 data.shape[0] 하면 data라는 이름의 data frame의 전체 row수를 출력 가능합니다.

 즉, .iloc는 이 번호로 특정 data를 선택할수 있도록 해주는 것이죠.

 물론 열도 마찬가지 입니다. (범위가 0부터 data.shape[1] 이겠네요)

 

 하지만 어찌뎃건 문자로 서술하는 것은 설명하는 사람이나 보는 사람이나 혼동을 야기할 것입니다. 

 

 코드로 예시를 보겠습니다.

 

 

data.iloc[0] # data의 첫번째 행만
data.iloc[1] # 두번째 행만
data.iloc[-1] # 마지막 행만
# Columns:
data.iloc[:,0] # 첫번째 열만
data.iloc[:,1] # 두번째 열만
data.iloc[:,-1] # 마지막 열만

행이든, 열을 하나만 선택하는 예시였습니다. 

역시 숫자만 사용했군요. 이제 여러 행/열을 선택하는 예시를 봅시다.

 

data.iloc[0:5] # 첫 5개행만
data.iloc[:, 0:2] # 첫 2개열만
data.iloc[[0,3,6,24], [0,5,6]] # 1st, 4th, 7th, 25th 행과 + 1st 6th 7th 열만
data.iloc[0:5, 5:8] # 첫 5개 행과 5th, 6th, 7th 열만

 

.iloc을 사용할때는 2가지를 기억하셔야 합니다.

 

1. 어떻게 선택하느냐에 따라 Series로 값이 반환될수도 있고 DataFrame으로 반환될수도 있습니다.

   Return값이 어떤 형식인지는 이후 코드르 이어감에 있어서 명확히 알아야 되는 항목이겠죠.

   왜 인지는 .. 굳이 설명 안해도 되겠죠?.

   ( ex, 행하나만 선택했다고 상상해보세요. 이러한 케이스와 비슷할 경우 어떤 타입으로 반환될지도 )

 

2. 여러개의 행과 열을 선택할 경우에 예시에서도 보셨겠지만 예를 들어

    [1:5]이면 1,2,3,4까지이고, 5가 포함되지 않는다는 걸 헷갈리시면 안됩니다.

 

사실 iloc는 잘 사용되진 않습니다. 알고 있으면 유용하겠지만요.

 

2. label이나 조건표현으로 선택하는 방법 (.loc)

 2.1 Label과 인덱스의 활용을 통한 .loc

 

 

위와 같은 Data가 있다고 생각해봅시다.

 

last_name에 Andrade와 Veness로 이름되어 있는 행을 선택하려 한다고 생각해보자구요.

 

.loc를 이용하면 아래와 같이 간단하게 해결할수 있습니다.

 

data.loc['Andrade']  # Andrade 행만 선택
data.loc[['Andrade','Veness']] # Andrade와 Veness 둘다 선택

 

하지만 또 여기서 잊지 말아야 할게 있죠.

 

위의 예시중 첫번째는 series를 반환한다는 거고 두번째는 dataframe을 반환한다는 것.

 

같은 방법으로 열도 가능합니다. 행/열 동시에 label로 선택하는 예시를 잠시 볼까요?

 

data.loc[['Andreade','Veness'],['first_name', 'address', 'city']]

요로케 하면 되겠네요.

 

아하... 그런데 저렇게 일일이 다 타이핑 치기가 귀찮네요.. 

 

어쩌죠?

 

...

 

이미 좋은 방법을 알고 계실 겁니다 .

 

아래와 같이 범위표현도 가능하다는 것을요.

 

 

data.loc[['Andrade', 'Veness'], 'city':'email']

 

 

특정 숫자로 구별가능하도록 한 id정보가 있는 column이 있다고 상상해봅시다.

그럼 아래와 같이 indexing도 가능합니다.

 

# Change the index to be based on the 'id' column
data.set_index('id', inplace=True)
# select the row with 'id' = 487
data.loc[487]

data.loc[487]의 결과는 당연히 data.iloc[487]과는 다를 거라는거 이해하시죠?

 

2.2 참/거짓, logical index 과 .loc 활용

가정 : data의 first_name 열이 'Antonio'라는 행을 선택하고 싶다??

 

위 가정에 대해서 생각해봅시다. 

pandas와 기본문법을 활용해서 조건식을 만들어주면 되겠구나 하고 언뜻 생각이드네요. 

 

그냥 바로 아래 예시로 넘어갑시다.

 

data[data['first_name'] == 'Antonio']

간단하기 그지 없네요.

 

아하 그런데 저 조건의 행에 특정 열만 선택할려면 어찌....

 

이것도 이미 우리는 알고 있죠?

 

data[data['first_name'] == 'Antonio', 'email']

 

 

요로케 email 열만 조건에 맞게 출력되도록요.

 

물론 이미 익힌 방법으로 여러 열을 표시할수도 있겠지만 여기서 하나 짚고 넘어갈게 있습니다.

바로 위 예시와 같이 실행하면 결과 형식은??

 

네. 당연히 series로 나출력되겠네요.

 

형식이 자꾸 바뀌어서 불편하다 나는 그냥 출력이 그대로 Dataframe 형식이였으면 좋을것 같다. 이런 경우는 어찌해야 되까요?

 

네 방법이 없는 건 아닙니다. 간단히 반환형식이 바뀌게 할수 있죠 아래와 같이요.

 

 

data[data['first_name'] == 'Antonio', ['email']]

 

 

이것 외에도 다양하고 복합적인 활용이 있을 것 같습니다만 금번 포스트는 요로케 서두없이 서둘러 마무리하도록 하겠습니다.

 

posting 할수록 글실력이 늘어야 되는데 늘지 않네요.

 

다음번 포스팅에는 급한 마음을 가지지 않고 퀄리티를 좀 더 높여보도록 하겠습니다.