programing

panda .at vs .loc

lastmoon 2023. 9. 14. 23:27
반응형

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

반응형