Programing

iloc, ix 및 loc은 어떻게 다릅니 까?

lottogame 2020. 10. 4. 10:15
반응형

iloc, ix 및 loc은 어떻게 다릅니 까?


이 세 가지 슬라이스 방법이 어떻게 다른지 설명 할 수 있습니까?
나는 문서를 보았고 이러한 답변 을 보았지만 여전히 세 가지가 어떻게 다른지 설명 할 수 없음을 발견했습니다. 나에게 그들은 낮은 수준의 슬라이싱에 있기 때문에 대체로 상호 교환이 가능한 것처럼 보입니다.

예를 들어, 우리가 DataFrame. 이 세 가지 모두 어떻게 작동합니까?

df.loc[:5]
df.ix[:5]
df.iloc[:5]

누군가가 사용의 구별이 더 명확한 세 가지 사례를 제시 할 수 있습니까?


참고 : 팬더 버전 0.20.0 이상으로 ix되어 사용되지 않는 및 사용 loc과는 iloc대신 권장합니다. 이 답변의 일부 ix는 이전 버전의 pandas 사용자를위한 참조로 그대로 설명했습니다 . 에 대한 대안을 보여주는 예제가 아래에 추가되었습니다ix .


먼저, 다음은 세 가지 방법을 요약 한 것입니다.

  • loc인덱스에서 특정 레이블 이있는 행 (또는 열)을 가져옵니다.
  • iloc인덱스의 특정 위치 에서 행 (또는 열)을 가져옵니다 (따라서 정수만 사용함).
  • ix일반적으로 같은 동작을 시도 loc하지만 iloc인덱스에 레이블이없는 경우 처럼 동작 합니다.

ix사용하기 약간 까다로울 수있는 몇 가지 미묘한 점에 주목하는 것이 중요 합니다.

  • 인덱스가 정수 유형이면 ix레이블 기반 인덱싱 만 사용하고 위치 기반 인덱싱으로 돌아 가지 않습니다. 레이블이 색인에 없으면 오류가 발생합니다.

  • 인덱스가 포함되지 않은 경우 에만 정수를, 다음의 정수를 주어 ix바로 레이블 기반 인덱싱보다는 위치 기반 인덱싱을 사용합니다. 그러나 ix다른 유형 (예 : 문자열)이 주어지면 레이블 기반 인덱싱을 사용할 수 있습니다.


세 가지 방법의 차이점을 설명하기 위해 다음 시리즈를 고려하십시오.

>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
>>> s
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
4    NaN
5    NaN

정수 값으로 슬라이싱하는 방법을 살펴 보겠습니다 3.

이 경우 s.iloc[:3]처음 3 개 행을 반환하고 (3 개를 위치로 처리하므로) s.loc[:3]처음 8 개 행을 반환합니다 (3 개를 레이블로 처리하므로).

>>> s.iloc[:3] # slice the first three rows
49   NaN
48   NaN
47   NaN

>>> s.loc[:3] # slice up to and including label 3
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN

>>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN

Notice s.ix[:3]s.loc[:3]위치에서 작업하는 대신 레이블을 먼저 찾는 것과 동일한 Series를 반환합니다 (그리고 인덱스 s는 정수 유형 임).

인덱스에없는 정수 레이블로 시도하면 (예 :) 6?

여기에 s.iloc[:6]예상대로 시리즈의 첫 번째 6 개 행을 반환합니다. 그러나 색인에 없기 s.loc[:6]때문에 KeyError 6가 발생합니다.

>>> s.iloc[:6]
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN

>>> s.loc[:6]
KeyError: 6

>>> s.ix[:6]
KeyError: 6

위에서 언급 한 미묘한 점에 따라 s.ix[:6]이제는 작동을 시도 loc하지만 6인덱스에서를 찾을 수 없기 때문에 KeyError가 발생합니다 . 우리의 인덱스가 정수이기 때문에 유형 ix처럼 행동에 다시 떨어지지 않는다 iloc.

그러나 인덱스가 혼합 유형 인 경우 정수 ixilocKeyError를 발생시키는 대신 즉시 작동합니다 .

>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
>>> s2.index.is_mixed() # index is mix of different types
True
>>> s2.ix[:6] # now behaves like iloc given integer
a   NaN
b   NaN
c   NaN
d   NaN
e   NaN
1   NaN

명심 ix여전히 같은 비 정수와 행동하라를 받아 들일 수 loc:

>>> s2.ix[:'c'] # behaves like loc given non-integer
a   NaN
b   NaN
c   NaN

일반적인 조언으로 레이블을 사용하여 색인을 생성하거나 정수 위치를 사용하여 색인을 생성하는 경우 예상치 못한 결과를 사용 loc하거나 iloc방지하려면을 사용하지 마십시오 ix.


위치 기반 및 레이블 기반 인덱싱 결합

때때로 DataFrame이 주어지면 행과 열에 대해 레이블 및 위치 인덱싱 방법을 혼합하고 싶을 것입니다.

예를 들어, 다음 DataFrame을 고려하십시오. 최선의 방법 행까지 'C'에 등을 슬라이스 처음 네 개의 열을?

>>> df = pd.DataFrame(np.nan, 
                      index=list('abcde'),
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN

이전 버전의 Pandas (0.20.0 이전) ix에서는이 작업을 매우 깔끔하게 수행 할 수 있습니다. 레이블별로 행을, 위치별로 열을 분할 할 수 있습니다 (열의 경우 ix4열 이름이 아니기 때문에 위치 기반 분할로 기본 설정됩니다. ) :

>>> df.ix[:'c', :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

이후 버전의 pandas에서는 iloc다른 방법을 사용하여이 결과를 얻을 수 있습니다 .

>>> df.iloc[:df.index.get_loc('c') + 1, :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

get_loc()"이 색인에서 레이블의 위치를 ​​가져옵니다"를 의미하는 색인 ​​메소드입니다. slicing with iloc는 끝점을 제외 하므로 행 'c'도 원할 경우이 값에 1을 더해야합니다.

여기 pandas 문서에 추가 예제가 있습니다 .


iloc정수 위치 지정을 기반으로 작동합니다. 따라서 행 레이블이 무엇이든 상관없이 항상 다음을 수행하여 첫 번째 행을 가져올 수 있습니다.

df.iloc[0]

또는 수행하여 마지막 다섯 행

df.iloc[-5:]

열에서도 사용할 수 있습니다. 세 번째 열을 검색합니다.

df.iloc[:, 2]    # the : in the first position indicates all rows

이들을 결합하여 행과 열의 교차점을 얻을 수 있습니다.

df.iloc[:3, :3] # The upper-left 3 X 3 entries (assuming df has 3+ rows and columns)

반면에 .loc명명 된 인덱스를 사용하십시오. 행 및 열 레이블로 문자열을 사용하여 데이터 프레임을 설정해 보겠습니다.

df = pd.DataFrame(index=['a', 'b', 'c'], columns=['time', 'date', 'name'])

그런 다음 첫 번째 행을 얻을 수 있습니다.

df.loc['a']     # equivalent to df.iloc[0]

'date'열의 두 번째 두 행은

df.loc['b':, 'date']   # equivalent to df.iloc[1:, 1]

등등. 이제, 그것은의 기본 행 및 열 인덱스는 지적 아마 가치가 DataFrame정수가 0이 경우에 ilocloc같은 방식으로 작동합니다. 이것이 세 가지 예가 동등한 이유입니다. 문자열이나 날짜 시간과 같은 숫자가 아닌 인덱스 df.loc[:5] 가 있으면 오류가 발생합니다.

또한 데이터 프레임의 __getitem__다음 을 사용하여 열 검색을 수행 할 수 있습니다 .

df['time']    # equivalent to df.loc[:, 'time']

이제 위치와 명명 된 인덱싱, 즉 행의 이름과 열의 위치를 ​​사용하는 인덱싱을 원한다고 가정합니다 (명확하게 말하자면, 행 인덱스에 문자열과 정수가 포함 된 데이터 프레임을 만드는 대신 데이터 프레임에서 선택한다는 의미입니다. 열 인덱스). 이것이 .ix들어오는 입니다.

df.ix[:2, 'time']    # the first two rows of the 'time' column

또한 부울 벡터를 loc메서드에 전달할 수 있다는 점도 언급 할 가치가 있다고 생각합니다 . 예를 들면 :

 b = [True, False, True]
 df.loc[b] 

의 첫 번째 및 세 번째 행을 반환합니다 df. 이것은 df[b]선택 과 동일 하지만 부울 벡터를 통한 할당에도 사용할 수 있습니다.

df.loc[b, 'name'] = 'Mary', 'John'

제 생각에는 누락 된 값 만있는 DataFrame을 사용하기 때문에 허용되는 대답은 혼란 스럽습니다. 나는 또한 용어처럼하지 않는 위치에 기반 을 위해 .iloc대신, 선호하는 위치의 정수 훨씬 더 자세한 설명과 정확히 같은 .iloc의미합니다. 핵심 단어는 INTEGER- .ilocINTEGERS가 필요합니다.

자세한 내용 은 하위 집합 선택에 대한 매우 자세한 블로그 시리즈참조하십시오.


.ix는 더 이상 사용되지 않으며 모호하며 절대 사용해서는 안됩니다.

.ix은 더 이상 사용되지 않기 때문에 .loc의 차이점에만 초점을 맞출 것 .iloc입니다.

차이점에 대해 이야기하기 전에 DataFrame에는 각 열과 각 인덱스를 식별하는 데 도움이되는 레이블이 있다는 것을 이해하는 것이 중요합니다. 샘플 DataFrame을 살펴 보겠습니다.

df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
                   'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
                   'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
                   'height':[165, 70, 120, 80, 180, 172, 150],
                   'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
                   'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
                   },
                  index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])

여기에 이미지 설명 입력

굵게 표시된 모든 단어 는 레이블입니다. 라벨은, age, color, food, height, scorestate에 사용되는 . 다른 레이블, Jane, Nick, Aaron, Penelope, Dean, Christina, Cornelia에 사용되는 인덱스 .


DataFrame에서 특정 행을 선택하는 기본 방법은 .loc.iloc인덱서를 사용하는 것입니다. 이러한 각 인덱서는 동시에 열을 선택하는 데 사용할 수도 있지만 지금은 행에만 집중하는 것이 더 쉽습니다. 또한 각 인덱서는 이름 바로 뒤에 오는 대괄호 집합을 사용하여 선택합니다.

.loc은 레이블로만 데이터를 선택합니다.

먼저 .loc인덱스 또는 열 레이블로만 데이터를 선택 하는 인덱서 에 대해 이야기하겠습니다 . 샘플 DataFrame에서는 인덱스 값으로 의미있는 이름을 제공했습니다. 많은 DataFrames에는 의미있는 이름이 없으며 대신 0에서 n-1 사이의 정수만 기본값으로 사용됩니다. 여기서 n은 DataFrame의 길이입니다.

사용할 수있는 세 가지 입력이 있습니다. .loc

  • 문자열
  • 문자열 목록
  • 문자열을 시작 및 중지 값으로 사용하는 슬라이스 표기법

문자열이있는 .loc로 단일 행 선택

단일 데이터 행을 선택하려면 색인 레이블을 괄호 뒤에 배치 .loc합니다.

df.loc['Penelope']

데이터 행을 시리즈로 반환합니다.

age           4
color     white
food      Apple
height       80
score       3.3
state        AL
Name: Penelope, dtype: object

문자열 목록이있는 .loc으로 여러 행 선택

df.loc[['Cornelia', 'Jane', 'Dean']]

그러면 목록에 지정된 순서대로 행이있는 DataFrame이 반환됩니다.

여기에 이미지 설명 입력

슬라이스 표기법으로 .loc으로 여러 행 선택

슬라이스 표기법은 시작, 중지 및 단계 값으로 정의됩니다. 라벨로 슬라이스 할 때 pandas는 반환에 중지 값을 포함합니다. Aaron에서 Dean까지 다음 조각을 포함합니다. 단계 크기는 명시 적으로 정의되어 있지 않지만 기본값은 1입니다.

df.loc['Aaron':'Dean']

여기에 이미지 설명 입력

복잡한 슬라이스는 Python 목록과 동일한 방식으로 가져올 수 있습니다.

.iloc은 정수 위치로만 데이터를 선택합니다.

이제 .iloc. DataFrame의 모든 데이터 행과 열에는이를 정의하는 정수 위치가 있습니다. 이것은 출력에 시각적으로 표시되는 레이블에 추가됩니다 . 정수 위치는 0에서 시작하는 상단 / 왼쪽부터 행 / 열의 수입니다.

사용할 수있는 세 가지 입력이 있습니다. .iloc

  • 정수
  • 정수 목록
  • 정수를 시작 및 중지 값으로 사용하는 슬라이스 표기법

정수로 .iloc으로 단일 행 선택

df.iloc[4]

이것은 5 번째 행 (정수 위치 4)을 Series로 반환합니다.

age           32
color       gray
food      Cheese
height       180
score        1.8
state         AK
Name: Dean, dtype: object

정수 목록이있는 .iloc으로 여러 행 선택

df.iloc[[2, -2]]

이것은 세 번째 행과 두 번째 행부터 마지막 ​​행까지의 DataFrame을 반환합니다.

여기에 이미지 설명 입력

슬라이스 표기법으로 .iloc으로 여러 행 선택

df.iloc[:5:3]

여기에 이미지 설명 입력


.loc 및 .iloc을 사용하여 행과 열을 동시에 선택

둘 다의 뛰어난 기능 중 하나 .loc/.iloc는 행과 열을 동시에 선택할 수 있다는 것입니다. 위의 예에서 모든 열은 각 선택에서 반환되었습니다. 행과 동일한 유형의 입력을 가진 열을 선택할 수 있습니다. 행과 열 선택을 쉼표로 구분 하기 만하면 됩니다.

예를 들어 다음과 같이 열 높이, 점수 및 상태 만있는 Jane 및 Dean 행을 선택할 수 있습니다.

df.loc[['Jane', 'Dean'], 'height':]

여기에 이미지 설명 입력

이것은 행에 대한 레이블 목록과 열에 대한 슬라이스 표기법을 사용합니다.

.iloc정수만 사용하여 자연스럽게 유사한 작업을 수행 할 수 있습니다 .

df.iloc[[1,4], 2]
Nick      Lamb
Dean    Cheese
Name: food, dtype: object

레이블 및 정수 위치를 사용한 동시 선택

.ix was used to make selections simultaneously with labels and integer location which was useful but confusing and ambiguous at times and thankfully it has been deprecated. In the event that you need to make a selection with a mix of labels and integer locations, you will have to make both your selections labels or integer locations.

For instance, if we want to select rows Nick and Cornelia along with columns 2 and 4, we could use .loc by converting the integers to labels with the following:

col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names] 

Or alternatively, convert the index labels to integers with the get_loc index method.

labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]

Boolean Selection

The .loc indexer can also do boolean selection. For instance, if we are interested in finding all the rows wher age is above 30 and return just the food and score columns we can do the following:

df.loc[df['age'] > 30, ['food', 'score']] 

You can replicate this with .iloc but you cannot pass it a boolean series. You must convert the boolean Series into a numpy array like this:

df.iloc[(df['age'] > 30).values, [2, 4]] 

Selecting all rows

It is possible to use .loc/.iloc for just column selection. You can select all the rows by using a colon like this:

df.loc[:, 'color':'score':2]

여기에 이미지 설명 입력


The indexing operator, [], can select rows and columns too but not simultaneously.

Most people are familiar with the primary purpose of the DataFrame indexing operator, which is to select columns. A string selects a single column as a Series and a list of strings selects multiple columns as a DataFrame.

df['food']

Jane          Steak
Nick           Lamb
Aaron         Mango
Penelope      Apple
Dean         Cheese
Christina     Melon
Cornelia      Beans
Name: food, dtype: object

Using a list selects multiple columns

df[['food', 'score']]

여기에 이미지 설명 입력

사람들이 덜 익숙한 점은 슬라이스 표기법을 사용하면 선택이 행 레이블 또는 정수 위치에 의해 발생한다는 것입니다. 이것은 매우 혼란스럽고 거의 사용하지 않지만 작동합니다.

df['Penelope':'Christina'] # slice rows by label

여기에 이미지 설명 입력

df[2:6:2] # slice rows by integer location

여기에 이미지 설명 입력

.loc/.iloc행 선택 위한 의 명시 성 이 매우 선호됩니다. 인덱싱 연산자만으로는 행과 열을 동시에 선택할 수 없습니다.

df[3:5, 'color']
TypeError: unhashable type: 'slice'

참고 URL : https://stackoverflow.com/questions/31593201/how-are-iloc-ix-and-loc-different

반응형