Pandas에서 Iloc와 Loc: 예제와 함께하는 가이드

Pandas를 배울 때 우리가 모두 해결하려고 하는 귀찮은 것 중 하나는 .loc.iloc의 구분입니다.

이 혼란을 끝내고 이 두 가지 방법의 차이를 명확히 해봅시다. 많은 예제를 제공할 것이며, 이 블로그가 끝날 무렵에는 그 차이가 훨씬 더 명확해지기를 바랍니다.

Pandas에서 .loc와 .iloc란?

.loc.iloc는 Pandas DataFrame의 필수 속성이며, 둘 다 특정 데이터의 하위 집합을 선택하는 데 사용됩니다. 이들의 목적은 전체 DataFrame 대신 DataFrame의 특정 부분에 접근하고 조작할 수 있도록 하는 것입니다.

특징

.loc

.iloc

구문

df.loc[row_indexer, column_indexer]

df.iloc[row_indexer, column_indexer]

색인 방법

라벨 기반 색인

위치 기반 색인

참조에 사용됨

행 및 열 레이블(이름)

행 및 열의 숫자 인덱스(0부터 시작)

우리가 표에서 볼 수 있듯이, 구문은 매우 비슷하게 보입니다. 차이점은 row_indexercolumn_indexer 인수를 사용하는 방법에 있습니다. 이는 두 방법이 데이터를 색인하는 접근 방식이 다르기 때문입니다: .loc는 라벨 이름을 기반으로 색인하는 반면, .iloc는 행과 열의 숫자 위치 인덱스를 인수로 사용합니다.

두 방법 중 첫 번째인 .loc을 자세히 살펴보겠습니다.

.loc: 레이블로 선택하기

개념을 설명하기 위해 가상의 고객 데이터베이스를 df라는 이름의 이 데이터프레임으로 나타내 보겠습니다. 여기서 Customer ID는 행 인덱스를 나타냅니다:

고객 ID

이름

국가

지역

나이

C123

존 도우

미국

북미

67

C234

페트라 뮐러

독일

유럽

51

C345

알리 칸

파키스탄

아시아

19

C456

마리아 곤살레스

멕시코

북미

26

C567

데이비드 리

중국

아시아

40

여기에는 .loc로 행을 선택하는 네 가지 주요 방법이 있습니다. 포함된 내용은:

  • 단일 행 선택하기
  • 여러 행 선택하기
  • 일부 행 선택하기
  • 조건부 행 선택하기

.loc를 사용하여 단일 행 선택하기

단일 행을 선택하기 위해 우리는 검색하려는 행의 레이블을 row_indexer로 사용합니다. 따라서 구문은 다음과 같습니다: df.loc['row_label']. 이를 사용하여 고객 Ali Khan의 모든 정보를 표시해 보겠습니다:

df.loc['C345']

C345

 

이름

Ali Khan

국가

파키스탄

지역

아시아

나이

19

.loc를 사용하여 여러 행 선택

우리가 순서대로 나오지 않는 여러 행을 선택하려면 row_indexer 인수로 행 레이블의 목록을 전달해야 합니다. 이는 정규 .loc 구문과 레이블 목록을 위한 두 개의 대괄호 쌍을 사용해야 함을 의미합니다.

df.loc[['row_label_1', 'row_label_2']]라인은 목록에서 지정된 df DataFrame의 두 행을 반환합니다. 예를 들어, Ali Khan에 대한 정보뿐만 아니라 David Lee에 대한 정보도 알고 싶다고 가정해 봅시다:

df.loc[['C345', 'C567']]

고객 ID

이름

국가

지역

나이

C345

알리 칸

파키스탄

아시아

19

C567

데이비드 리

중국

아시아

40

행의 일부를 .loc를 사용하여 선택하기

첫 번째와 마지막 행 레이블을 콜론으로 구분하여 전달함으로써 행의 범위를 선택할 수 있습니다: df.loc['row_label_start':'row_label_end']. 다음과 같이 데이터프레임의 첫 네 행을 표시할 수 있습니다:

df.loc['C123' : 'C456']

고객 ID

이름

국가

지역

가입 날짜

C123

존 도우

미국

북미

67

C234

페트라 뮐러

독일

유럽

51

C345

알리 칸

파키스탄

아시아

19

C456

마리아 곤잘레스

멕시코

북미

26

여기서 염두에 두어야 할 두 가지가 있습니다:

  1. 출력에는 row_label_end로 지정된 행이 포함됩니다. 이는 나중에 다룰 .iloc과 다릅니다.
  2. 여러 행을 검색하려면 하나의 대괄호 쌍만 사용합니다. 여러 행을 검색하려면 목록을 사용하지 않으므로 대괄호를 두 개 사용하면 SyntaxError가 발생합니다.

조건부 선택을 사용하여 행 선택하기 .loc

조건식을 기반으로 행을 반환할 수도 있습니다. 특정 조건을 충족하는지 여부에 따라 모든 행을 필터링하고 해당 행만 표시할 수 있습니다.

해당 구문은 df.loc[조건식]이며, 조건식은 특정 열의 허용된 값에 대한 문을 나타냅니다.

숫자가 아닌 데이터(예: 이름 또는 국가)가 있는 열의 경우, 값 간에 순서가 없기 때문에 등호 또는 부등호 연산자만 사용할 수 있습니다. 예를 들어, 아시아 출신이 아닌 모든 고객의 행을 반환할 수 있습니다:

df.loc[df['Region'] != 'Asia']

고객 ID

이름

국가

지역

나이

C123

존 도우

미국

북미

67

C234

페트라 뮐러

독일

유럽

51

C456

마리아 곤잘레스

멕시코

북미

26

단일 열 선택하기 .loc 사용하기

열을 선택하기 위해서는 column_indexer 인자를 지정해야 하며, 이는 row_indexer 인자 뒤에 옵니다. 만약 column_indexer만 지정하고 싶다면, 모든 행을 반환하고 열에서만 필터링하고 싶다는 것을 표시해야 합니다. 어떻게 할 수 있는지 알아봅시다!

단일 열 선택은 해당 열의 레이블로 column_indexer를 지정하여 수행할 수 있습니다. 모든 행을 가져오기 위해서는 간단한 콜론으로 row_indexer를 지정해야 합니다. 다음과 같은 구문에 도달하게 됩니다: df.loc[:, 'column_name'].

각 고객의 이름을 표시해봅시다:

df.loc[:, 'Name']

고객 ID

이름

C123

존 도우

C234

페트라 뮐러

C345

알리 칸

C456

마리아 곤잘레스

C567

데이비드 리

여러 열을 선택하는 방법 .loc

여러 행을 선택하는 것과 유사하게, 순서가 반드시 따르지 않는 여러 DataFrame의 열을 반환하려면 열 레이블 목록을 전달해야 합니다: df.loc[:, [col_label_1, 'col_label_2']].

모든 고객의 나이를 마지막 출력에 추가하고 싶다고 가정하면 다음과 같이 작동합니다:

df.loc[:, ['Name', 'Age']]

고객 ID

이름

나이

C123

존 도우

67

C234

페트라 뮐러

51

C345

알리 칸

19

C456

마리아 곤잘레스

26

C567

다비드 리

40

열의 슬라이스를 .loc를 사용하여 선택하기

두 열의 레이블 사이에 콜론을 사용하면 지정된 두 열 사이의 모든 열을 선택합니다. 이는 끝 열을 포함하며, 즉 col_end라는 이름의 열도 표준 구문에서 선택됩니다. 표준 구문은 다음과 같습니다: df.loc[:, 'col_start':'col_end'].

고객의 이름, 국가, 지역에 관심이 있다면, 우리의 코드 라인은 다음과 같을 수 있습니다:

df.loc[:, 'Name':'Region']

고객 ID

이름

국가

지역

C123

존 도우

미국

북아메리카

C234

페트라 뮐러

독일

유럽

C345

알리 칸

파키스탄

아시아

C456

마리아 곤잘레스

멕시코

북아메리카

C567

데이비드 리

중국

아시아

행과 열 선택을 결합하여 .loc

행 인덱서와 열 인덱서를 모두 지정하는 것도 가능합니다. 이는 DataFrame에서 하나의 정보를 즉, 하나의 셀을 검색하는 데 사용될 수 있습니다. 이를 위해서는 df.loc['row_label', 'column_name'] 구문을 사용하여 하나의 행과 하나의 열을 지정합니다.

더 유용한 경우는 우리가 관심 있는 특정 행과 열 집합에 초점을 맞춘 하위 DataFrame을 반환하는 것입니다. 인덱서를 리스트로 대괄호를 사용하여 지정하거나, 콜론을 사용하여 슬라이스로 지정할 수 있으며, 심지어 행 선택을 위해 조건 표현식을 결합할 수도 있습니다.

다음은 30세 이상의 Age를 가진 각 고객의 Name, Country, Region을 반환하는 예입니다:

df.loc[df['Age'] > 30, 'Name':'Region']

고객 ID

이름

국가

지역

C123

존 도

미국

북미

C234

페트라 뮐러

독일

유럽

C567

데이비드 리

중국

아시아

정수 위치를 통한 선택:

.iloc는 레이블이 아니라 위치로 선택합니다. .iloc를 사용하는 표준 구문은 다음과 같습니다: df.iloc[row_indexer, column_indexer]. 주의해야 할 두 가지 특별한 사항이 있습니다:

  • 0부터 시작하는 개수 세기: 첫 번째 행과 열의 인덱스는 0이며, 두 번째는 1, 등등입니다.
  • 범위 끝 값의 배타성: 슬라이스를 사용할 때, 콜론 뒤에 지정된 행이나 열은 선택에 포함되지 않습니다.

.iloc를 사용하여 단일 행 선택하기

단일 행은 행 인덱스 번호를 나타내는 정수를 row_indexer로 사용하여 선택할 수 있습니다. .loc와 달리 레이블 문자열이 아닌 정수 번호를 입력하고 있으므로 따옴표가 필요 없습니다. df라는 DataFrame의 첫 번째 행을 반환하려면 df.iloc[0]를 입력합니다.

우리의 예시 DataFrame에서 이 코드 라인은 존 도의 정보를 반환합니다:

df.iloc[0]

C123

 

Name

John Doe

Country

United States

Region

North America

Age

67

Selecting multiple rows using .iloc

Selecting multiple rows works in .iloc as it does in .loc—we enter the row index integers in a list with squared brackets. The syntax looks like this: df.iloc[[0, 3, 4]].

The respective output in our customer table can be seen below:

df.iloc[[0, 3, 4]]

Customer ID

Name

Country

Region

Age

C123

John Doe

미국

북미

67

C456

마리아 곤잘레스

멕시코

북미

26

C567

데이비드 리

중국

아시아

40

.iloc를 사용하여 행의 슬라이스 선택하기

행의 슬라이스를 선택하기 위해서는 지정된 두 개의 행 인덱스 정수 사이에 콜론을 사용합니다. 이제 우리는 앞서 언급한 배타성에 주의를 기울여야 합니다.

이 개념을 설명하기 위해 df.iloc[1:4] 라인을 예로 들 수 있습니다. 인덱스 번호 1은 두 번째 행을 의미하므로 우리의 슬라이스는 거기서 시작됩니다. 인덱스 정수 4는 다섯 번째 행을 나타내지만 .iloc는 슬라이스 선택에 대해 포함되지 않으므로 우리의 출력은 이 행 바로 전까지의 모든 행을 포함합니다. 따라서 두 번째, 세 번째 및 네 번째 행이 반환됩니다.

이 라인이 제대로 작동한다는 것을 증명해 봅시다:

df.iloc[1:4]

고객 ID

이름

국가

지역

나이

C234

페트라 뮐러

독일

유럽

51

C345

알리 칸

파키스탄

아시아

19

C456

마리아 곤잘레스

멕시코

북미

26

단일 열 선택 .iloc 사용

.iloc를 사용하여 열을 선택하는 논리는 지금까지 배운 내용을 따릅니다. 하나의 열, 여러 열 및 열 슬라이스에 대해 어떻게 작동하는지 살펴보겠습니다.

.loc와 마찬가지로, row_indexer를 명시해야 column_indexer로 진행할 수 있는 것이 중요합니다. 모든 행의 df의 세 번째 열의 값을 검색하려면 df.iloc[:, 2]를 입력합니다.

우리 DataFrame에서 Region이 세 번째 열이기 때문에 해당 코드 라인의 결과로 검색될 것입니다:

df.iloc[:, 2]

Customer ID

Region

C123

North America

C234

Europe

C345

Asia

C456

North America

C567

Asia

여러 열 선택하기 .iloc

연속적이지 않은 여러 열을 선택하기 위해서는 column_indexer로 정수를 포함하는 리스트를 입력할 수 있습니다. df.iloc[:, [0, 3]]는 첫 번째와 네 번째 열을 반환합니다.

우리의 경우, 표시되는 정보는 각 고객의 NameAge입니다:

df.iloc[:, [0, 3]]

고객 ID

이름

나이

C123

존 도우

67

C234

페트라 뮐러

51

C345

알리 칸

19

C456

마리아 곤잘레스

26

C567

다비드 리

40

열의 슬라이스 선택하기 .iloc

슬라이스 선택을 위해 .iloc를 사용할 경우, column_indexer의 논리는 row_indexer와 동일합니다. 콜론 뒤의 정수로 표현된 열은 출력에 포함되지 않습니다. 두 번째와 세 번째 열을 가져오려면 코드 줄은 다음과 같아야 합니다: df.iloc[:, 1:3].

아래 줄은 고객에 대한 모든 지리적 정보를 반환합니다:

df.iloc[:, 1:3]

고객 ID

국가

지역

C123

미국

북미

C234

독일

유럽

C345

파키스탄

아시아

C456

멕시코

북아메리카

C567

중국

아시아

행과 열 선택을 위한 .iloc 사용법

우리가 .iloc에 대해 배운 내용을 바탕으로 행과 열 선택을 결합할 수 있습니다. 다시 말해, 단일 셀 또는 하위 데이터프레임을 반환하는 것이 가능합니다. 3행과 4열이 만나는 지점의 단일 셀을 반환하려면 df.iloc[2, 3]를 입력합니다.

.loc와 마찬가지로, 우리는 대괄호를 사용하여 인덱서를 리스트로 지정하거나 콜론을 사용하여 슬라이스로 지정할 수 있습니다. 조건 표현식을 사용하여 행을 선택하고 싶다면, 기술적으로 .iloc로도 가능하지만 권장하지 않습니다. 레이블 이름과 .loc을 사용하는 것이 일반적으로 더 직관적이고 오류가 발생할 가능성이 적습니다.

이 마지막 예제는 데이터프레임의 첫 번째, 두 번째 및 다섯 번째 행에 대한 국가, 지역나이를 표시합니다:

df.iloc[[0,1,4], 1:4]

고객 ID

국가

지역

나이

C123

미국

북아메리카

67

C234

독일

유럽

51

C567

중국

아시아

40

.iloc vs .loc: When to Use Which

일반적으로, DataFrame의 메소드 선택은 다음과 같은 간단한 규칙에 의해 달라집니다:

  • .loc을 사용하십시오 행/열의 레이블(이름)을 알고 있을 때.
  • 행/열의 .iloc 정수 위치를 알고 있을 때 사용하세요.

일부 시나리오는 본질적으로 .loc 또는 .iloc에 유리합니다. 예를 들어, 행이나 열을 반복하는 것은 레이블보다 정수를 사용하는 것이 더 쉽고 직관적입니다. 이미 언급했듯이, 열 값에 대한 조건을 기반으로 행을 필터링하는 것은 열 레이블 이름을 사용할 때 오류에 덜 취약합니다.

.loc을 선호하는 시나리오

.iloc을 선호하는 시나리오

귀하의 DataFrame에는 의미 있는 인덱스/열 이름이 있습니다.

행/열을 위치에 따라 반복하고 있습니다.

열 값에 대한 조건에 따라 필터링해야 합니다.

인덱스/열 이름은 작업과 관련이 없습니다.

KeyError, NameError, 그리고 Index Error .loc 및 .iloc 사용 시

가능한 문제를 살펴보겠습니다. .loc를 사용할 때 흔히 발생하는 함정은 KeyError입니다. 이 오류는 데이터프레임 내에 존재하지 않는 행 또는 열 레이블에 접근하려고 할 때 발생합니다. 이를 피하려면, 항상 사용하고 있는 레이블이 정확하고 데이터프레임의 기존 레이블과 일치하는지 확인하고 오타가 없는지 다시 확인해야 합니다.

또한, .loc를 사용하여 지정된 레이블에는 항상 따옴표를 사용하는 것이 중요합니다. 이를 잊으면 NameError가 발생합니다.

.iloc를 사용할 때 IndexError가 발생할 수 있습니다. 이는 DataFrame의 인덱스 범위를 벗어난 정수 위치를 지정했을 때 발생합니다. 이 오류는 액세스하려는 인덱스가 존재하지 않을 때 발생하며, 이는 DataFrame의 행 또는 열 수를 벗어나거나 음수 값을 사용했기 때문일 수 있습니다. 이 오류를 방지하려면 DataFrame의 차원을 확인하고 유효한 범위 내의 적절한 인덱스 값을 사용하십시오.

결론

이 블로그가 도움이 되었기를 바라며, .loc.iloc의 차이가 이제 명확해졌기를 희망합니다. 더 알아보려면 다음 단계를 확인해보세요.

Source:
https://www.datacamp.com/tutorial/loc-vs-iloc