Ответ 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