panda .at vs .loc
코드를 최적화하는 방법을 탐색하다가 우연히 발견했습니다.pandas
.at
방법.설명서대로
빠른 라벨 기반 스칼라 액세스 장치
loc와 유사하게 at는 레이블 기반 스칼라 룩업을 제공합니다.이러한 인덱서를 사용하여 설정할 수도 있습니다.
그래서 몇가지 샘플을 조사해봤습니다.
세우다
import pandas as pd
import numpy as np
from string import letters, lowercase, uppercase
lt = list(letters)
lc = list(lowercase)
uc = list(uppercase)
def gdf(rows, cols, seed=None):
"""rows and cols are what you'd pass
to pd.MultiIndex.from_product()"""
gmi = pd.MultiIndex.from_product
df = pd.DataFrame(index=gmi(rows), columns=gmi(cols))
np.random.seed(seed)
df.iloc[:, :] = np.random.rand(*df.shape)
return df
seed = [3, 1415]
df = gdf([lc, uc], [lc, uc], seed)
print df.head().T.head().T
df
다음과 같습니다.
a
A B C D E
a A 0.444939 0.407554 0.460148 0.465239 0.462691
B 0.032746 0.485650 0.503892 0.351520 0.061569
C 0.777350 0.047677 0.250667 0.602878 0.570528
D 0.927783 0.653868 0.381103 0.959544 0.033253
E 0.191985 0.304597 0.195106 0.370921 0.631576
사용합시다.at
그리고..loc
그리고 같은 것을 얻었는지 확인합니다.
print "using .loc", df.loc[('a', 'A'), ('c', 'C')]
print "using .at ", df.at[('a', 'A'), ('c', 'C')]
using .loc 0.37374090276
using .at 0.37374090276
테스트 속도.loc
%%timeit
df.loc[('a', 'A'), ('c', 'C')]
10000 loops, best of 3: 180 µs per loop
테스트 속도.at
%%timeit
df.at[('a', 'A'), ('c', 'C')]
The slowest run took 6.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8 µs per loop
이것은 엄청난 속도 증가로 보입니다.캐싱 단계에서도6.11 * 8
보다 훨씬 빠릅니다.180
질문.
의 한계는 무엇입니까?.at
? 저는 그것을 사용하고 싶은 의욕이 있습니다.문서에는 다음과 유사하다고 나와 있습니다..loc
하지만 비슷한 행동을 하지는 않습니다.예:
# small df
sdf = gdf([lc[:2]], [uc[:2]], seed)
print sdf.loc[:, :]
A B
a 0.444939 0.407554
b 0.460148 0.465239
반면에.print sdf.at[:, :]
결과를 보다TypeError: unhashable type
그래서 의도가 비슷하다고 해도 분명히 같지 않습니다.
그렇기는 하지만, 누가 무엇을 할 수 있고 무엇을 할 수 없는지에 대한 지침을 제공할 수 있습니다..at
방법?
업데이트: 버전 0.21.0에서 더 이상 사용되지 않습니다.df.at
아니면df.iat
는 앞으로 권장되는 방법입니다.
df.at
는 한 번에 하나의 값에만 액세스할 수 있습니다.
df.loc
여러 행 및/또는 열을 선택할 수 있습니다.
단일 값에 액세스하는 속도가 훨씬 빠를 수도 있습니다.
In [25]: %timeit df.loc[('a', 'A'), ('c', 'C')]
10000 loops, best of 3: 187 µs per loop
In [26]: %timeit df.at[('a', 'A'), ('c', 'C')]
100000 loops, best of 3: 8.33 µs per loop
In [35]: %timeit df.get_value(('a', 'A'), ('c', 'C'))
100000 loops, best of 3: 3.62 µs per loop
후드 밑에,df.at[...]
호출하지만 키를 확인하는 타입도 있습니다.
당신이 질문한 것처럼..at
, 여기 제가 최근에 마주친 한 가지가 있습니다(팬더 0.22 사용).설명서의 예를 사용해 보겠습니다.
df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], index=[4, 5, 6], columns=['A', 'B', 'C'])
df2 = df.copy()
A B C
4 0 2 3
5 0 4 1
6 10 20 30
내가 지금 하면.
df.at[4, 'B'] = 100
결과는 예상대로 보입니다.
A B C
4 0 100 3
5 0 4 1
6 10 20 30
하지만 제가 하려고 할 때는
df.at[4, 'C'] = 10.05
는 데이터 유형을 보존하려고 시도하는 것 같습니다(여기: ).
A B C
4 0 100 10
5 0 4 1
6 10 20 30
그것은 다른 점인 것 같습니다..loc
:
df2.loc[4, 'C'] = 10.05
원하는 결과를 가져옵니다.
A B C
4 0 2 10.05
5 0 4 1.00
6 10 20 30.00
위의 예에서 위험한 것은 그것이 소리 없이 일어난다는 것입니다(에서 변환).float
로.int
문자열로 동일하게 시도하면 오류가 발생합니다.
df.at[5, 'A'] = 'a_string'
ValueError: 기본 10의 int() 리터럴이 잘못되었습니다. 'a_string'
그러나 만약 누군가가 그 위에 끈을 사용한다면 그것은 효과가 있을 것입니다.int()
@n1k31t4가 댓글에 언급한 것처럼 실제로 작동합니다. 예를 들어.
df.at[5, 'A'] = '123'
A B C
4 0 2 3
5 123 4 1
6 10 20 30
위의 내용을 추가하면, 팬더 문서는 다음과 같습니다.at
함수 상태:
행/열 레이블 쌍에 대한 단일 값에 액세스합니다.
loc과 유사하게 둘 다 레이블 기반 룩업을 제공합니다.DataFrame 또는 Series에서 단일 값만 가져오거나 설정해야 하는 경우 에 사용합니다.
데이터 loc
그리고.at
예를 들어 다음과 같습니다.
df = pd.DataFrame({'A': [1,2,3], 'B': [11,22,33]}, index=[0,0,1])
둘다요.loc
그리고.at
한 결과가 어낼다은다낼l어e를e은 .
df.at[0, 'A'] = [101,102]
df.loc[0, 'A'] = [101,102]
A B
0 101 11
0 102 22
1 3 33
df.at[0, 'A'] = 103
df.loc[0, 'A'] = 103
A B
0 103 11
0 103 22
1 3 33
또한, 단일 값에 액세스하는 경우, 둘 다 동일합니다.
df.loc[1, 'A'] # returns a single value (<class 'numpy.int64'>)
df.at[1, 'A'] # returns a single value (<class 'numpy.int64'>)
3
개의 값을 는 을 시킬 의 ,loc
,는 DataFrame은콜을을 반환합니다.at
값을를 반환합니다.
df.loc[0, 'A'] # returns a Series (<class 'pandas.core.series.Series'>)
0 103
0 103
Name: A, dtype: int64
df.at[0, 'A'] # returns array of values (<class 'numpy.ndarray'>)
array([103, 103])
더 .loc
는 행시키는 데 할 수 할 수 ,행콜과는데할수며만다할수다만수할n며과수는콜행/할e데ela/odhfat
.
df.loc[0] # returns a DataFrame view (<class 'pandas.core.frame.DataFrame'>)
A B
0 103 11
0 103 22
# df.at[0] # ERROR: must receive column
.at
과여된터스다에 비해 접근 방법입니다..loc
.
.loc
데이터 프레임의 경우 인수에서 주어진 대로 indexed_rows 및 labeled_labeled_labeled로 위치한 모든 요소를 선택합니다.대신에,.at
주어진 indexed_row 및 labeled_column에 위치한 데이터 프레임의 특정 요소를 선택합니다.
그리고 ..at
,는과의을력로는면의,면는s로e,.loc
여러 행과 열을 사용할 수 있습니다.을을 이용한 출력.at
는일며합니다 를 사용합니다..loc
시리즈 또는 Data Frame 일 수 있습니다 있습니다 series 수 data 또는 frame 일 . . <nat>
의 는 의 또 다른 .at
은 ㅇ.loc
다른 )을 한로른을다과은다을른과t(r은(n한ss,에r으로 ).at
그렇지 않습니다.
> df = pd.DataFrame([[1, 2],
[0, 0],
],
columns=["A", "B"])
> df["A"] > 0 # is a pd.Series of bool values
> df.loc[df["A"] > 0, "B"] # provides the first line in this example
> df.at[df["A"] > 0, "B"] # using .at will raise InvalidIndexError
언급URL : https://stackoverflow.com/questions/37216485/pandas-at-versus-loc
'programing' 카테고리의 다른 글
2개의 WordPress에서 사용자 공유하기 동일한 서버의 2개 하위 도메인에 설치 (0) | 2023.09.14 |
---|---|
IN 절에 변수를 전달하는 방법? (0) | 2023.09.14 |
MariaDB 권한 문제 - [Warning] 사용자 'rphsp'@'raspberrypi.lan'에 대한 액세스가 거부되었습니다. (0) | 2023.09.14 |
Oracle - 리터럴이 형식 문자열 오류와 일치하지 않습니다. (0) | 2023.09.14 |
다른 테이블에 의한 MySQL 사용자 지정 주문 (0) | 2023.09.14 |