第一行代码是使用 Boolean 进行选择Series,而第二行是使用 Boolean 进行选择DataFrame,这些代码的处理方式非常不同,因为 DataFrame 是 2D 并且有 2 个轴要对齐。在pandas 文档中有一个部分专门用于说明这种差异。
在第一种情况下,使用布尔系列进行选择,您仅返回布尔系列中的行的所有列True。
在使用 Boolean DataFrame 进行选择的情况下,您返回一个与原始形状相同的对象,其中True保留了 Boolean DataFrame 中的值,并且任何False值都替换为NaN. (它实际上实现为DataFrame.where)对于没有出现在您的布尔数据框掩码中的行和列,它们NaN默认成为。
import pandas as pd
df = pd.DataFrame({'a': [1, 2, np.NaN, 4],
'b': [10, 11, 12, 13]})
# Boolean Series, return all columns only for for rows where condition is True
df[df['a'] == 2]
# a b
#1 2.0 11
# Boolean DataFrame, equivalent to df.where(df[['a']] == 2)
df[df[['a']] == 2]
# a b
#0 NaN NaN
#1 2.0 NaN
#2 NaN NaN
#3 NaN NaN