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_indexer
와 column_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 |
여기서 염두에 두어야 할 두 가지가 있습니다:
- 출력에는
row_label_end
로 지정된 행이 포함됩니다. 이는 나중에 다룰.iloc
과 다릅니다. - 여러 행을 검색하려면 하나의 대괄호 쌍만 사용합니다. 여러 행을 검색하려면 목록을 사용하지 않으므로 대괄호를 두 개 사용하면
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]]
는 첫 번째와 네 번째 열을 반환합니다.
우리의 경우, 표시되는 정보는 각 고객의 Name
및 Age
입니다:
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
의 차이가 이제 명확해졌기를 희망합니다. 더 알아보려면 다음 단계를 확인해보세요.