Подтвердить что ты не робот

Python: Pandas Series - Зачем использовать loc?

Почему мы используем 'loc' для pandas dataframes? кажется, что следующий код с использованием или без использования loc и компиляция anr запускается с симуляционной скоростью

%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?

Изменить: Это помечено как дублирующийся вопрос. Но хотя pandas iloc vs ix vs loc explain? упоминает, что *

вы можете выполнить поиск столбцов, просто используя фрейм данных GetItem

*

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

он не говорит, почему мы используем loc, хотя он объясняет множество особенностей loc, мой конкретный вопрос: "Почему бы просто не опустить loc вообще"? для которого я принял очень подробный ответ ниже.

Кроме того, что другая должность ответ (который я не думаю, что это ответ) очень скрыт в обсуждении, и любой человек, ищущий то, что я искал, будет трудно найти информацию и будет намного лучше обслуживаться ответ на мой вопрос.

4b9b3361

Ответ 1

  • Явный лучше, чем неявный.

    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. Вместо этого он вызывает ValueError:

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

    Напротив, следующее не поднимает ValueError, хотя структура df2 почти одинакова:

    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
    

    Также обратите внимание, что

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

    Таким образом, df[boolean_mask] не всегда ведет себя так же, как df.loc[boolean_mask]. Несмотря на то, что это, вероятно, маловероятный прецедент, я бы рекомендовал всегда использовать df.loc[boolean_mask] вместо df[boolean_mask], потому что значение синтаксиса df.loc является явным. С помощью df.loc[indexer] вы автоматически знаете, что df.loc выбирает строки. Напротив, неясно, будет ли df[indexer] выбирать строки или столбцы (или поднять ValueError), не зная подробностей о indexer и df.

  • df.loc[row_indexer, column_index] может выбирать строки и столбцы. df[indexer] может выбирать только строки или столбцы в зависимости от типа значений в indexer, а тип значений столбца df (опять же, они являются логическими?).

    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