itsource

iloc과 loc의 차이점은 무엇입니까?

mycopycode 2022. 9. 27. 23:52
반응형

iloc과 loc의 차이점은 무엇입니까?

누가 이 두 슬라이스 방법이 어떻게 다른지 설명해 줄 수 있나요?
의사들도 봤고, 이런 답변들도 봤지만, 이 세 가지가 어떻게 다른지 아직도 이해할 수 없어요.슬라이싱의 하위 단계이기 때문에 대체적으로 교환이 가능한 것 같습니다.

를 들어, 「 」, 「 」의 첫 번째 5 을 취득한다고 .DataFrame이은은 떻떻? ???? ???

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

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


이 두 이 어떻게 요.df.ix[:5]ix팬더 1.0에서 제거됐기 때문에 더 이상 신경 쓰지 않아요.

라벨과위치

두 방법의 주요 차이점은 다음과 같습니다.

  • loc특정 레이블이 있는 행(및/또는 열)을 가져옵니다.

  • iloc정수 위치에 행(및/또는 열)을 가져옵니다.

나타내려면 , 의 「」를 .s비음성 정수 인덱스를 가진 문자:

>>> s = pd.Series(list("abcdef"), index=[49, 48, 47, 0, 1, 2]) 
49    a
48    b
47    c
0     d
1     e
2     f

>>> s.loc[0]    # value at index label 0
'd'

>>> s.iloc[0]   # value at index location 0
'a'

>>> s.loc[0:1]  # rows at index labels between 0 and 1 (inclusive)
0    d
1    e

>>> s.iloc[0:1] # rows at index location between 0 and 1 (exclusive)
49    a

여기에서는, 다음의 몇개의 차이점/유사점을 나타냅니다.s.loc ★★★★★★★★★★★★★★★★★」s.iloc다음과 같이 합니다.

<개체> 묘사 s.loc[<object>] s.iloc[<object>]
0 단품목 인덱스 레이블의 값 0(문자열))'d') 인덱스 위치 0의 값(문자열)'a')
0:1 조각을 내라 줄(라벨)0 ★★★★★★★★★★★★★★★★★」1) 1행(위치 0의 첫 번째 행)
1:47 끝이 어긋난 슬라이스 0 행(빈 시리즈) 5행(위치 1 이후)
1:47:-1 마이너스 스텝으로 슬라이스하다 3열(표준)1으로 47) 0 행(빈 시리즈)
[2, 0] 정수 리스트 지정된 레이블이 있는 두 행 지정된 위치를 가진 두 줄
s > 'e' Bool 계열(특성이 있는 값을 나타냄) 1행(포함)'f') NotImplementedError
(s>'e').values 불 배열 1행(포함)'f') 와다같 same loc
999 int 개체가 인덱스에 없습니다. KeyError IndexError를 벗어남) (범위를 벗어남)
-1 int 개체가 인덱스에 없습니다. KeyError 한다.s
lambda x: x.index[3] 시리즈에 적용되는 호출 가능(여기서 인덱스로 3개 항목을 반환함rd) s.loc[s.index[3]] s.iloc[s.index[3]]

loc님의 라벨 쿼리 기능은 잘 정리된 정수 인덱스를 확장하므로 몇 가지 추가 예를 강조할 필요가 있습니다.

인덱스에 문자열 개체가 포함된 시리즈가 있습니다.

>>> s2 = pd.Series(s.index, index=s.values)
>>> s2
a    49
b    48
c    47
d     0
e     1
f     2

★★loc의 값을 할 수 .이 은, 「」, 「」를 사용합니다.s2.loc['a']. 의 오브젝트로 도 있습니다 정수 이외의 오브젝트로 슬라이스할 수도 있습니다.

>>> s2.loc['c':'e']  # all rows lying between 'c' and 'e' (inclusive)
c    47
d     0
e     1

Date Time 인덱스의 경우 레이블별로 가져오기 위해 정확한 날짜/시간을 전달할 필요가 없습니다.예를 들어 다음과 같습니다.

>>> s3 = pd.Series(list('abcde'), pd.date_range('now', periods=5, freq='M')) 
>>> s3
2021-01-31 16:41:31.879768    a
2021-02-28 16:41:31.879768    b
2021-03-31 16:41:31.879768    c
2021-04-30 16:41:31.879768    d
2021-05-31 16:41:31.879768    e

2021년 3월/4월 행을 가져오려면 다음 항목만 있으면 됩니다.

>>> s3.loc['2021-03':'2021-04']
2021-03-31 17:04:30.742316    c
2021-04-30 17:04:30.742316    d

행과 열

loc ★★★★★★★★★★★★★★★★★」iloc데이터 프레임 시리즈두 가지 방법 모두 열과 행을 함께 지정할 수 있습니다.

태플이 지정되면 첫 번째 요소는 행을 인덱싱하는 데 사용되며, 두 번째 요소는 열을 인덱싱하는 데 사용됩니다.

다음에 정의되어 있는 Data Frame에 대해 생각해 보겠습니다.

>>> import numpy as np 
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                      index=list('abcde'), 
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a   0   1   2   3   4
b   5   6   7   8   9
c  10  11  12  13  14
d  15  16  17  18  19
e  20  21  22  23  24

예를 들어 다음과 같습니다.

>>> df.loc['c': , :'z']  # rows 'c' and onwards AND columns up to 'z'
    x   y   z
c  10  11  12
d  15  16  17
e  20  21  22

>>> df.iloc[:, 3]        # all rows, but only the column at index location 3
a     3
b     8
c    13
d    18
e    23

수 .loc ★★★★★★★★★★★★★★★★★」iloc.

예를 들어 다음 Data Frame을 생각해 보겠습니다.행을 'c'까지 잘라 처음 4개의 열을 얻는 가장 좋은 방법은 무엇입니까?

>>> import numpy as np 
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                      index=list('abcde'), 
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a   0   1   2   3   4
b   5   6   7   8   9
c  10  11  12  13  14
d  15  16  17  18  19
e  20  21  22  23  24

를 얻을 수 .iloc 또 방법의 을 받을 수 있습니다.

>>> df.iloc[:df.index.get_loc('c') + 1, :4]
    x   y   z   8
a   0   1   2   3
b   5   6   7   8
c  10  11  12  13

get_loc() 는 "이 인덱스에서 라벨의 위치를 가져옵니다"를 의미하는 인덱스 메서드입니다.슬라이스 할 때 부터iloc는 엔드 포인트에서 제외됩니다.행 'c'도 필요한 경우 이 값에 1을 추가해야 합니다.

iloc정수 위치에 따라 동작합니다. 행 이 어떤행 라벨이 항상 첫 번째 수 .

df.iloc[0]

또는 마지막 5행은 다음과 같습니다.

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은 0의 입니다.이 경우iloc ★★★★★★★★★★★★★★★★★」loc같은 방식으로 작동한다는 거죠이것이 당신의 세 가지 예가 동일한 이유입니다.문자열이나 날짜 시간 등 숫자가 아닌 인덱스가 있는 경우 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'

데이터 프레임에 결측값만 있기 때문에, 제 생각에, 받아들여진 답변은 혼란스럽습니다.또한 포지션 베이스라는 용어는 마음에 들지 않습니다..iloc그 대신 정수 위치를 선호합니다. 훨씬 더 설명적이고 정확히 무엇이.iloc의 약자입니다.INTEGER - INGERE이다..iloc을 사용하다

서브셋 선택에 대한 자세한 내용은 블로그 시리즈를 참조하십시오.


.ix는 권장되지 않으며 모호하므로 절대 사용하지 마십시오.

★★★★★★★★★★★★★★★★★★.ix되지 않는 내용입니다.하겠습니다.우리는 단지 그 사이의 차이점에만 초점을 맞출 것입니다..loc ★★★★★★★★★★★★★★★★★」.iloc.

차이에 대해 설명하기 전에 데이터 프레임에 각 열과 인덱스를 식별하는 데 도움이 되는 레이블이 있다는 점을 이해하는 것이 중요합니다.데이터 프레임의 예를 보겠습니다.

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,score ★★★★★★★★★★★★★★★★★」state컬럼에 사용됩니다.다른 라벨은Jane,Nick,Aaron,Penelope,Dean,Christina,Cornelia인덱스에 사용됩니다.


은 DataFrame을 하는 입니다..loc ★★★★★★★★★★★★★★★★★」.iloc, 이 더 .각 인덱서를 사용하여 열을 동시에 선택할 수도 있지만 지금은 행에만 초점을 맞추는 것이 더 쉽습니다.또한 각 인덱서는 이름 바로 뒤에 이어지는 일련의 괄호를 사용하여 항목을 선택합니다.

.loc은 라벨로만 데이터를 선택합니다.

''에 하겠습니다..loc인덱스 또는 열 레이블로만 데이터를 선택하는 인덱서입니다.샘플 Data Frame에서는 인덱스 값으로 의미 있는 이름을 제공했습니다.많은 데이터 프레임에는 의미 있는 이름이 없으며 대신 기본적으로 0 ~n-1의 정수만 지정됩니다. 여기서 n은 데이터 프레임의 길이입니다.

세 요..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를 사용하여 여러 행 선택

슬라이스 표기법은 시작, 중지 및 단계 값으로 정의됩니다.라벨로 슬라이스할 때 판다는 반환에 정지 값을 포함합니다.아론에서 딘까지 이어지는 슬라이스입니다.스텝 사이즈는 명시적으로 정의되어 있지 않지만 기본값은 1 입니다.

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

여기에 이미지 설명 입력

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

.iloc는 정수 위치만 사용하여 데이터를 선택합니다.

이번에는 ,, 그로 볼까요?.iloc. DataFrame 내의 모든 데이터 행과 열에는 데이터 프레임을 정의하는 정수 위치가 있습니다.출력에 시각적으로 표시되는 라벨에 추가됩니다.정수 위치는 0부터 시작하는 맨 위/왼쪽 행/열의 개수입니다.

세 요..iloc

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

.iloc에서 정수를 사용하여 단일 행 선택

df.iloc[4]

그러면 5번째 행(정수 위치 4)이 시리즈로 반환됩니다.

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는 라벨 및 정수 위치와 동시에 선택하기 위해 사용되었습니다.이는 유용하지만 때때로 혼란스럽고 모호하여 다행히 폐지되었습니다.라벨과 정수 위치를 혼합하여 선택해야 하는 경우 선택 라벨 또는 정수 위치를 모두 지정해야 합니다.

를 들어 행을 Nick ★★★★★★★★★★★★★★★★★」Cornelia4열과 2열 4열 4열도 사용할 수 ..loc수음음 음 음 음 、 음 음 음 、 음 음 다 、

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

을 "인덱스 라벨"을 "인덱스 라벨"로합니다.get_loc인덱스 방식

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

부울 선택

할 수 .loc ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」를 들어 30세 이상의 food ★★★★★★★★★★★★★★★★★」score은 다음과할 수 .

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

을 똑같이 수 요..iloc부울 급수는 전달할 수 없습니다.다음과 같이 부울 시리즈를 numpy 배열로 변환해야 합니다.

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

모든 행 선택

합니다..loc/.iloc열 선택에만 사용할 수 있습니다.다음과 같이 콜론을 사용하여 모든 행을 선택할 수 있습니다.

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

여기에 이미지 설명 입력


연산자 ""는[]에서는 행과 열을 동시에 선택할 수도 있지만 동시에 선택할 수는 없습니다.

대부분의 사람들은 DataFrame 인덱싱 연산자의 주요 목적, 즉 열을 선택하는 것에 익숙합니다.문자열은 단일 열을 Series로 선택하고 문자열 목록은 여러 열을 DataFrame으로 선택합니다.

df['food']

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

목록을 사용하여 여러 열을 선택합니다.

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'

.loc ★★★★★★★★★★★★★★★★★」.iloc인덱스에 사용됩니다. 즉, 데이터의 일부를 꺼내는 데 사용됩니다.다른 점은 질질,, in점 in in 이다..loc는 라벨 인덱싱을 가능하게 만, 「」는 「」입니다..iloc위치 기반 인덱싱을 사용할 수 있습니다.

.loc ★★★★★★★★★★★★★★★★★」.iloc해 주세요..iloc는 인덱스(i부터 시작) 위치를 기반으로 합니다..loc는 라벨(l부터 시작)에 근거하고 있습니다.

.loc

.loc파이썬그러나 부울 배열, 슬라이스 및 레이블 목록(Python 사전에서 작동하지 않음)을 사용할 수 있습니다.

iloc

.iloc 위치 '인덱스 위치')를 합니다.pandasPython ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」 pandas을 벌다IndexError★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

다음 예시는 다음 두 가지 차이점을 설명하기 위해서.iloc ★★★★★★★★★★★★★★★★★」.loc하다

>>> s = pd.Series([11, 9], index=["1990", "1993"], name="Magic Numbers")
>>> s
1990    11
1993     9
Name: Magic Numbers , dtype: int64

.iloc »

>>> s.iloc[0]
11
>>> s.iloc[-1]
9
>>> s.iloc[4]
Traceback (most recent call last):
    ...
IndexError: single positional indexer is out-of-bounds
>>> s.iloc[0:3] # slice
1990 11
1993  9
Name: Magic Numbers , dtype: int64
>>> s.iloc[[0,1]] # list
1990 11
1993  9
Name: Magic Numbers , dtype: int64

.loc »

>>> s.loc['1990']
11
>>> s.loc['1970']
Traceback (most recent call last):
    ...
KeyError: ’the label [1970] is not in the [index]’
>>> mask = s > 9
>>> s.loc[mask]
1990 11
Name: Magic Numbers , dtype: int64
>>> s.loc['1990':] # slice
1990    11
1993     9
Name: Magic Numbers, dtype: int64

★★★★★★★★★★★★★★★★★★s 인덱스 값, 즉 '인덱스 값'이 ..loc하다

>>> s.loc[0]
Traceback (most recent call last):
    ...
KeyError: 0
  • DataFrame.loc(): 값으로
  • DataFrame.iloc(): 행 행 " " " "

예:

, 5행, 5행, 선택합니다.df1입니다.

df1.iloc[:5]

첫 , , A행, B행, 을 선택합니다.df1입니다.

df1.loc['A','B']

다음 예에서는 그 차이를 보여 줍니다.

df = pd.DataFrame({'col1': [1,2,3,4,5], 'col2': ["foo", "bar", "baz", "foobar", "foobaz"]})
  col1  col2
0   1   foo
1   2   bar
2   3   baz
3   4   foobar
4   5   foobaz

df = df.sort_values('col1', ascending = False)
      col1  col2
    4   5   foobaz
    3   4   foobar
    2   3   baz
    1   2   bar
    0   1   foo

인덱스 기반 액세스:

df.iloc[0, 0:2]
col1         5
col2    foobaz
Name: 4, dtype: object

정렬된 데이터 프레임의 첫 번째 행이 표시됩니다.(인덱스 0 행이 아니라 인덱스 4 행입니다).

위치 기반 액세스:

df.loc[0, 'col1':'col2']
col1      1
col2    foo
Name: 0, dtype: object

df가 정렬되어 있어도 인덱스0 의 행을 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/31593201/how-are-iloc-and-loc-different

반응형