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

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

%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 объясняет? упоминает, что *

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

*

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

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

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

  • разделил серию Pandas без мультииндекса
  • Объединение двух серий в DataFrame в пандах
  • как вычислить подвижный idxmax
  • Построение CDF серии pandas в python
  • Оценка значений серии pandas с помощью логических выражений и if-операторов
  • Как превратить блок данных в ряд списков?
  • One Solution collect form web for “Python: Pandas Series – Зачем использовать loc?”

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

      df[boolean_mask] выбирает строки, где boolean_mask имеет значение True, но есть угловой случай, когда вы этого не захотите: когда 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]: AB 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]: AB 1 2 4 2 3 5 In [271]: df2[1:2] Out[271]: AB 1 2 4 
    Python - лучший язык программирования в мире.