팬더 로크 vs 일록 vs 일트?
에서 Python으로 했는데, Python의 셀.Pandas
매뉴얼은 읽었지만 다양한 현지화/선택 옵션의 실제 의미를 이해하는데 어려움을 겪고 있습니다.
가 꼭 가가왜왜 is is?를 사용해야 하는 요?.loc
★★★★★★★★★★★★★★★★★」.iloc
에 걸쳐서at
, , , , 입니다.iat
아니면 그 반대일까요?어떤 상황에서 어떤 방법을 사용하면 좋을까요?
은 이 v0. 이전에 으로, 팬더 v0.20보다 : 래의0000 v0.20이라는 가 존재했었다는 점에 하십시오. 【v0.20】
.ix
이은 나중에 두 .loc
★★★★★★★★★★★★★★★★★」iloc
및 인덱스를 위치 기반 인덱스를 구분합니다.ix
는 일관성 없는 동작과 굽힘이 어려워 단종되었으며 현재 버전의 판다(>= 1.0)에는 더 이상 존재하지 않습니다.
loc: 인덱스에서만 작업
iloc: 위치 작업
at: 스칼라 값을 가져옵니다.매우 빠른 위치입니다.
iat: 스칼라 값을 가져옵니다.매우 빠른 속도입니다.
또한.
at
★★★★★★★★★★★★★★★★★」iat
는, 의 단일 하는 으로 하고 .스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라, 스칼라.loc
★★★★★★★★★★★★★★★★★」iloc
여러 요소에 동시에 액세스하여 잠재적으로 벡터화 연산을 수행할 수 있습니다.
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
★★★의 pandas
0.20
ix
을 사용하다은, 「」의 .loc
,iloc
,at
,iat
,set_value
위치 기반/라벨 기반 인덱싱을 혼합하여 수행하는 방법.
loc
- 라벨 베이스
전달할 수 .1-D 배열을 사용할수 .배열은 인덱스 또는 열의 슬라이스(하위 집합)이거나 인덱스 또는 열과 길이가 동일한 부울 배열일 수 있습니다.
특수 참고: 스칼라 인덱서가 통과되면loc
는 이전에 존재하지 않았던 새 인덱스 또는 열 값을 할당할 수 있습니다.
# label based, but we can use position values
# to get the labels from the index object
df.loc[df.index[2], 'ColName'] = 3
df.loc[df.index[1:3], 'ColName'] = 3
iloc
- 위치 기반
유사하다loc
지수 값이 아닌 위치가 있는 경우는 예외입니다.그러나 새 열이나 인덱스를 할당할 수 없습니다.
# position based, but we can get the position
# from the columns object via the `get_loc` method
df.iloc[2, df.columns.get_loc('ColName')] = 3
df.iloc[2, 4] = 3
df.iloc[:3, 2:4] = 3
at
- 라벨 베이스
비슷하게 동작합니다.loc
scalar 인덱서용.배열 인덱서에서 작동할 수 없습니다. 새 인덱스 및 열을 할당할 수 있습니다.
우위점loc
게게는는는는는는는는
단점은 인덱서에 어레이를 사용할 수 없다는 것입니다.
# label based, but we can use position values
# to get the labels from the index object
df.at[df.index[2], 'ColName'] = 3
df.at['C', 'ColName'] = 3
iat
- 위치 기반
와 동일하게 동작합니다.iloc
. 어레이 인덱서에서는 사용할 수 없습니다.새 인덱스 및 열을 할당할 수 없습니다.
우위점iloc
게게는는는는는는는는
단점은 인덱서에 어레이를 사용할 수 없다는 것입니다.
# position based, but we can get the position
# from the columns object via the `get_loc` method
IBM.iat[2, IBM.columns.get_loc('PNL')] = 3
set_value
- 라벨 베이스
비슷하게 동작합니다.loc
scalar 인덱서용.어레이 인덱서에서 작동할 수 없습니다. 새 인덱스 및 열을 할당할 수 있습니다.
장점 오버헤드가 매우 적기 때문에 매우 빠릅니다!
단점 오버헤드가 매우 적기 때문에pandas
안전 점검을 많이 안 하고 있어요본인 부담으로 사용하세요.또한, 이것은 공공용으로 의도된 것이 아닙니다.
# label based, but we can use position values
# to get the labels from the index object
df.set_value(df.index[2], 'ColName', 3)
set_value
위치 기반 포함
와 동일하게 동작합니다.iloc
. 어레이 인덱서에서는 사용할 수 없습니다.새 인덱스 및 열을 할당할 수 없습니다.
장점 오버헤드가 매우 적기 때문에 매우 빠릅니다!
단점 오버헤드가 매우 적기 때문에pandas
안전 점검을 많이 안 하고 있어요본인 부담으로 사용하세요.또한, 이것은 공공용으로 의도된 것이 아닙니다.
# position based, but we can get the position
# from the columns object via the `get_loc` method
df.set_value(2, df.columns.get_loc('ColName'), 3, takable=True)
판다들이 DataFrame에서 선택하는 방법은 크게 두 가지가 있습니다.
- 라벨별
- 정수 위치별
이 문서에서는 정수 위치를 나타내는 용어의 위치를 사용하고 있습니다.나는 이 용어가 혼란스러워서 좋아하지 않는다.정수 위치는 보다 알기 쉽고 정확하게 다음과 같습니다..iloc
의 약자입니다.여기서 키워드는 INTEGER입니다.정수 위치를 선택할 때는 정수를 사용해야 합니다.
개요를 표시하기 전에 모두 확인합시다.
.ix는 권장되지 않으며 모호하므로 절대 사용하지 마십시오.
판다에게는 세 가지 주요 지표가 있다.인덱스 연산자 자체(괄호), 및 가 있습니다.요약하면 다음과 같습니다.
[]
- 주로 열의 하위 집합을 선택하지만 행도 선택할 수 있습니다.행과 열을 동시에 선택할 수 없습니다..loc
- 행 및 열의 부분 집합을 레이블별로만 선택합니다..iloc
- 행과 열의 하위 집합을 정수 위치별로만 선택합니다.
거의 사용하지 않습니다.또는 기능이 추가되지 않고 약간의 퍼포먼스만 향상됩니다.시간이 많이 걸리는 어플리케이션이 없다면 사용을 권장하지 않겠습니다.어쨌든, 그 개요는 다음과 같습니다.
.at
는 DataFrame 내의 단일 스칼라 값을 라벨별로만 선택합니다..iat
정수 위치만 사용하여 DataFrame 내의 단일 스칼라 값을 선택합니다.
라벨 및 정수 위치에 의한 선택과 더불어 부울 인덱싱이라고도 하는 부울 선택이 존재합니다.
: ★★★.loc
,.iloc
및 , " " " ".at
★★★★★★★★★★★★★★★★★」.iat
에 나타냅니다.
'어울리지 않다'의 하겠습니다..loc
★★★★★★★★★★★★★★★★★」.iloc
차이에 대해 설명하기 전에 Data Frames에는 각 열과 각 행을 식별하는 데 도움이 되는 라벨이 있다는 것을 이해하는 것이 중요합니다.데이터 프레임의 예를 보겠습니다.
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
★★★★★★★★★★★★★★★★★」Cornelia
4열과 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'
★★★★★★★★★★★★★★에 의한 선택.at
★★★★★★★★★★★★★★★★★」.iat
선택 with를 사용한 .at
.loc
, DataFrame입니다.보통 이 셀을 스칼라 값이라고 부릅니다.「」를 .at
행 라벨과 컬럼라벨을 모두 콤마로 구분하여 전달합니다.
df.at['Christina', 'color']
'black'
선택 with를 사용한 .iat
.iloc
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다..
df.iat[2, 5]
'FL'
df = pd.DataFrame({'A':['a', 'b', 'c'], 'B':[54, 67, 89]}, index=[100, 200, 300])
df
A B
100 a 54
200 b 67
300 c 89
In [19]:
df.loc[100]
Out[19]:
A a
B 54
Name: 100, dtype: object
In [20]:
df.iloc[0]
Out[20]:
A a
B 54
Name: 100, dtype: object
In [24]:
df2 = df.set_index([df.index,'A'])
df2
Out[24]:
B
A
100 a 54
200 b 67
300 c 89
In [25]:
df2.ix[100, 'a']
Out[25]:
B 54
Name: (100, a), dtype: int64
작은 df부터 시작합시다.
import pandas as pd
import time as tm
import numpy as np
n=10
a=np.arange(0,n**2)
df=pd.DataFrame(a.reshape(n,n))
우리는 그렇게 할 것이다.
df
Out[25]:
0 1 2 3 4 5 6 7 8 9
0 0 1 2 3 4 5 6 7 8 9
1 10 11 12 13 14 15 16 17 18 19
2 20 21 22 23 24 25 26 27 28 29
3 30 31 32 33 34 35 36 37 38 39
4 40 41 42 43 44 45 46 47 48 49
5 50 51 52 53 54 55 56 57 58 59
6 60 61 62 63 64 65 66 67 68 69
7 70 71 72 73 74 75 76 77 78 79
8 80 81 82 83 84 85 86 87 88 89
9 90 91 92 93 94 95 96 97 98 99
여기에서는, 다음과 같은 것이 있습니다.
df.iloc[3,3]
Out[33]: 33
df.iat[3,3]
Out[34]: 33
df.iloc[:3,:3]
Out[35]:
0 1 2 3
0 0 1 2 3
1 10 11 12 13
2 20 21 22 23
3 30 31 32 33
df.iat[:3,:3]
Traceback (most recent call last):
... omissis ...
ValueError: At based indexing on an integer index can only have integer indexers
따라서 서브셋에는 .iat를 사용할 수 없습니다.여기서는 .iloc만 사용해야 합니다.
하지만 둘 다 더 큰 df에서 선택하고 속도를 확인해 봅시다.
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 7 09:58:39 2018
@author: Fabio Pomi
"""
import pandas as pd
import time as tm
import numpy as np
n=1000
a=np.arange(0,n**2)
df=pd.DataFrame(a.reshape(n,n))
t1=tm.time()
for j in df.index:
for i in df.columns:
a=df.iloc[j,i]
t2=tm.time()
for j in df.index:
for i in df.columns:
a=df.iat[j,i]
t3=tm.time()
loc=t2-t1
at=t3-t2
prc = loc/at *100
print('\nloc:%f at:%f prc:%f' %(loc,at,prc))
loc:10.485600 at:7.395423 prc:141.784987
따라서 .loc에서는 서브셋을 관리할 수 있고 .loc에서는 단일 스칼라로만 관리할 수 있지만 .at이 .loc보다 빠릅니다.
:-)
해 주십시오..loc
.[]
:
테스트 스크립트:
import os
import sys
from timeit import timeit
import numpy as np
import pandas as pd
def setup():
arr = np.arange(0, 10 ** 2)
return pd.DataFrame(arr.reshape(10, 10))
if __name__ == "__main__":
print(f"Python: {sys.version}")
print(f"Numpy: {np.__version__}")
print(f"Pandas: {pd.__version__}")
iters = 10000
print(
"[] Method:",
timeit(
"data = df[0]",
setup="from __main__ import setup; df = setup()",
number=iters,
),
)
print(
".loc() Method:",
timeit(
"data = df.loc[:, 0]",
setup="from __main__ import setup; df = setup()",
number=iters,
),
)
출력:
Python: 3.8.10 (tags/v3.8.10:3d8993a, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)]
Numpy: 1.21.1
Pandas: 1.3.3
[] Method: 0.0923579000000001
.loc() Method: 0.6762988000000001
언급URL : https://stackoverflow.com/questions/28757389/pandas-loc-vs-iloc-vs-at-vs-iat
'programing' 카테고리의 다른 글
Python에서 최소 플러그인 아키텍처 구축 (0) | 2022.09.06 |
---|---|
스프링에서의 오브젝트매퍼 설정 (0) | 2022.09.06 |
사용 중인 NumPy 버전을 확인하려면 어떻게 해야 합니까? (0) | 2022.09.06 |
MySQL 스키마/데이터베이스의 차이 (0) | 2022.09.06 |
gson을 사용한 다형성 (0) | 2022.09.06 |