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.
与使用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]
因为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