显式胜于隐式。
df[boolean_mask]选择行为boolean_maskTrue的行,但是在某些情况下可能不希望出现以下情况:当df具有布尔值的列标签时:
In [229]: df = pd.Dataframe({True:[1,2,3],False:[3,4,5]}); dfOut[229]: False True 0 3 11 4 22 5 3您可能要使用df[[True]]选择True列。相反,它引发一个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]}); df2Out[258]: A B0 1 31 2 42 3 5In [259]: df2[['B']]Out[259]: B0 31 42 5因此,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]只能根据中的值类型和列值的类型选择行或列(再次,它们是布尔值吗?)。indexerdf
In [237]: df2.loc[[True,False,True], 'B']Out[237]: 0 32 5Name: B, dtype: int64
将切片传递给df.loc端点时,端点将包含在范围内。将切片传递给时df[…],该切片将被解释为半开间隔:
In [239]: df2.loc[1:2]Out[239]: A B1 2 42 3 5In [271]: df2[1:2]Out[271]: A B1 2 4



