第一行代码是使用 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