首页 > 解决方案 > 当我将布尔数据帧传递给 pandas 中另一个数据帧的索引运算符时会发生什么?

问题描述

关于操作熊猫数据框有一些基本的东西,我没有得到。

TL,DR:将布尔系列传递给 pandas 数据帧的索引运算符 [] 返回该系列为 True 的 df 的行或列。但是传递一个布尔数据框(即:多维)会返回一个仅包含 NaN 值的奇怪数据框。

编辑:改写:为什么可以将布尔值的数据帧传递给另一个数据帧,它有什么作用?对于系列,这是有道理的,但是对于数据框,我不明白“幕后”发生了什么,以及为什么在我的示例中我得到一个空 NaN 值的数据框。

详细举例:

当我将 pandas 布尔系列传递给索引运算符时,它会返回与系列为 True 的索引对应的行列表:

test_list = [[1,2,3,4],[3,4,5],[4,5]]
test_df = pd.DataFrame(test_list)
test_df

    0   1   2   3
0   1   2   3.0 4.0
1   3   4   5.0 NaN
2   4   5   NaN NaN

test_df[test_df[2].isnull()]

    0   1   2   3
2   4   5   NaN NaN

到目前为止,一切都很好。但是当我这样做时会发生什么:

test_df[test_df.isnull()]


0   1   2   3
0   NaN NaN NaN NaN
1   NaN NaN NaN NaN
2   NaN NaN NaN NaN

为什么这会返回一个仅包含 NaN 值的数据框?我希望它要么返回一个错误,要么返回一个使用布尔掩码数据帧截断的新数据帧。但我发现这个输出完全令人困惑。

编辑:结果我希望得到一个错误。我不明白为什么在这些情况下可以传递数据帧,或者为什么它返回这个 NaN 值的数据帧

标签: pythonpandasdataframe

解决方案


test_df[..]调用索引方法__getitem__()。从源代码:

    def __getitem__(self, key):
        ...

        # Do we have a (boolean) DataFrame?
        if isinstance(key, DataFrame):
            return self.where(key)

        # Do we have a (boolean) 1d indexer?
        if com.is_bool_indexer(key):
            return self._getitem_bool_array(key)

如您所见,如果key是布尔数据帧,它将调用pandas.DataFrame.where()。的功能是替换默认情况where()下条件为的值。FalseNaN

# print(test_df.isnull())
       0      1      2      3
0  False  False  False  False
1  False  False  False   True
2  False  False   True   True

# print(test_df)
    0   1   2   3
0   1   2   3.0 4.0
1   3   4   5.0 NaN
2   4   5   NaN NaN

test_df.where(test_df.isnull())用 替换非空值NaN


推荐阅读