programing

파이썬: 팬더 시리즈 - 왜 loc을 사용합니까?

goodsources 2023. 9. 23. 22:33
반응형

파이썬: 팬더 시리즈 - 왜 loc을 사용합니까?

팬더 데이터 프레임에 'loc'을 사용하는 이유는 무엇입니까?loc를 사용하든 사용하지 않든 비슷한 속도로 complete anner를 실행하든 안하든 다음 코드처럼 보입니다.

%timeit df_user1 = df.loc[df.user_id=='5561']

100 loops, best of 3: 11.9 ms per loop

아니면

%timeit df_user1_noloc = df[df.user_id=='5561']

100 loops, best of 3: 12 ms per loop

그런데 왜 loc을 사용합니까?

편집: 중복 질문으로 플래그 지정되었습니다.하지만 팬더 iloc vs ix vs loc 설명이 있긴 하지만?그런 말이 있나요?

데이터 프레임의 get 항목만 사용하면 열 검색을 수행할 수 있습니다.

*

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

우리가 왜 loc을 사용하는지에 대해서는 언급하지 않았지만 loc의 많은 특징을 설명하고 있지만, 제 구체적인 질문은 '왜 그냥 loc을 완전히 생략하지 않는가' 입니다.아래의 매우 상세한 답변을 받아들였습니다.

또한 다른 게시물(내가 생각하기에 답이 아닌)은 토론에 매우 숨겨져 있으며 내가 찾고 있던 것을 검색하는 사람은 정보를 찾기가 어렵고 내 질문에 제공된 답에 의해 훨씬 더 나은 서비스를 제공받을 것입니다.

  • 명시적인 것이 암묵적인 것보다 낫습니다.

    df[boolean_mask]합니다인 합니다.boolean_mask수 경우: 다입니다.df부울 값 열 레이블:

    In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df
    Out[229]: 
       False  True 
    0      3      1
    1      4      2
    2      5      3
    

    를 .df[[True]]선택하다, 선택하다, 선택하다,True기둥.대신에 그것은 a를 올립니다.ValueError:

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    사용하는 것과 비교loc:

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    은 로, 를 .ValueError의 구조라 …df2다와 거의 .df1위:

    In [258]: df2 = pd.DataFrame({'A':[1,2,3],'B':[3,4,5]}); df2
    Out[258]: 
       A  B
    0  1  3
    1  2  4
    2  3  5
    
    In [259]: df2[['B']]
    Out[259]: 
       B
    0  3
    1  4
    2  5
    

    따라서,df[boolean_mask]는 항상.df.loc[boolean_mask] . , 합니다를 하는 것을 df.loc[boolean_mask]df[boolean_mask]f의 df.loc의 구문은 명확합니다.와 함께df.loc[indexer]으로 그다를 있습니다.df.loc행을 선택하는 중입니다.와는 대조적으로,.df[indexer]다림)를 올립니다.ValueError에 못한 채indexer그리고.df.

  • df.loc[row_indexer, column_index]과 열을 선택할 수 있습니다.df[indexer]값 유형에 따라 행 또는 열만 선택할 수 있습니다.indexerddf가 있습니다(또 부울인가요?).

    In [237]: df2.loc[[True,False,True], 'B']
    Out[237]: 
    0    3
    2    5
    Name: B, dtype: int64
    
  • 될 때df.loc종단점이 범위에 포함됩니다.될 때df[...]: 즉 해석됩니다.

    In [239]: df2.loc[1:2]
    Out[239]: 
       A  B
    1  2  4
    2  3  5
    
    In [271]: df2[1:2]
    Out[271]: 
       A  B
    1  2  4
    

.loc을 사용하거나 사용하지 않는 여러 열 "Chained Assignment"에 대한 성능 고려

시스템 성능을 고려하여 이미 매우 좋은 답변을 보완하겠습니다.

질문 자체는 .loc을 사용하는 경우와 사용하지 않는 경우의 2개 코드의 시스템 성능(실행 시간)에 대한 비교를 포함합니다.인용된 코드 샘플의 경우 실행 시간이 거의 같습니다.그러나 일부 다른 코드 샘플의 경우 .loc을 사용하는 경우와 사용하지 않는 경우 실행 시간에 상당한 차이가 있을있습니다. 예를 들어 몇 배 이상 차이가 나는 경우가 있습니다.

팬더 데이터 프레임 조작의 일반적인 경우는 기존 열의 값에서 파생된 새 열을 만들어야 한다는 것입니다.아래 코드를 사용하여 (기존 열을 기준으로) 조건을 필터링하고 다른 값을 새 열에 설정할 수 있습니다.

df[df['mark'] >= 50]['text_rating'] = 'Pass'

그러나 이러한 종류의 "체인된 할당"은 "보기" 대신 "복사본"을 만들 수 있으므로 작동하지 않으며, 이 "복사본"을 기반으로 새 열에 할당하면 원래 데이터 프레임이 업데이트되지 않습니다.

사용 가능한 2가지 옵션:

    1. .loc를 사용할 수도 있고, 또는
    1. .loc을 사용하지 않고 다른 방식으로 코딩합니다.

두 번째 경우 예:

df['text_rating'][df['mark'] >= 50] = 'Pass'

필터링을 마지막에 배치하면(새 열 이름을 지정한 후) 원래 데이터 프레임이 업데이트되어 할당이 잘 작동합니다.

.loc을 사용하는 솔루션은 다음과 같습니다.

df.loc[df['mark'] >= 50, 'text_rating'] = 'Pass'

이제 그들의 실행 시간을 보겠습니다.

.loc사용하지 않음:

%%timeit 
df['text_rating'][df['mark'] >= 50] = 'Pass'

2.01 ms ± 105 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

.loc 사용 시:

%%timeit 
df.loc[df['mark'] >= 50, 'text_rating'] = 'Pass'

577 µs ± 5.13 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

보시다시피 .loc을 사용하면 실행 시간이 3배 이상 빨라집니다.

"Chained Assignment"에 대한 보다 자세한 설명은 관련된 또 다른 게시물인 "SettingWithCopyWarning in pandas?"를 참고할 수 있습니다.그리고 특히 cs95의 답변.이 게시물은 .loc 사용의 기능적 차이를 설명하는 데 탁월합니다.여기서 시스템 성능(실행 시간) 차이를 보충해 드릴 뿐입니다.

이미 언급한 내용(loc 및 loc 및 loc 및 lolumn 선택에 대한 slicing을 수행하는 기능을 사용하지 않고 true, false를 열 이름으로 사용하는 경우 문제) 외에도 loc을 사용하여 특정 행 및 열에 값을 할당할 수 있다는 점도 큰 차이점입니다.부울 시리즈를 사용하여 데이터 프레임의 부분 집합을 선택하고 해당 부분 집합 선택의 값을 변경하려고 하면 SettingWithCopy 경고가 표시될 수 있습니다.

급여가 6만 이상인 모든 행에 대해 "상급 관리" 열을 변경하려고 한다고 가정해 보겠습니다.

다음 내용:

mask = df["salary"] > 60000
df[mask]["upper management"] = True

는 "Dataframe에서 슬라이스의 복사본에 값을 설정하려고 합니다"라는 경고를 던지며, df[mask]가 복사본을 만들고 해당 복사본의 "상위 관리"를 업데이트하려고 하면 원래 df에 영향을 미치지 않기 때문에 작동하지 않습니다.

하지만 성공은 다음과 같습니다.

mask = df["salary"] > 60000
df.loc[mask,"upper management"] = True

두 경우 모두 가능합니다.df[df["salary"] > 60000]아니면df.loc[df["salary"] > 60000], 하지만 변수에 부울 조건을 먼저 저장하는 것이 더 깔끔하다고 생각합니다.

언급URL : https://stackoverflow.com/questions/38886080/python-pandas-series-why-use-loc

반응형