Python 当我将一个布尔数据帧传递给pandas中另一个数据帧的索引操作符时会发生什么?

Python 当我将一个布尔数据帧传递给pandas中另一个数据帧的索引操作符时会发生什么?,python,pandas,dataframe,Python,Pandas,Dataframe,关于操作数据帧,有一些基本的东西我没有得到 TL,DR:将布尔序列传递给数据帧的索引运算符[],返回序列为真的df的行或列。但是传递布尔数据帧(即:多维)会返回一个只包含NaN值的奇怪数据帧 编辑:重新表述:为什么可以将布尔值的数据帧传递给另一个数据帧,它做什么?对于一个系列,这是有意义的,但是对于一个数据帧,我不理解“在引擎盖下”发生了什么,以及为什么在我的示例中我得到一个空NaN值的数据帧 详细说明及示例: 当我将布尔序列传递给索引运算符时,它将返回与该序列为真的索引对应的行列表: test

关于操作数据帧,有一些基本的东西我没有得到

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

编辑:重新表述:为什么可以将布尔值的数据帧传递给另一个数据帧,它做什么?对于一个系列,这是有意义的,但是对于一个数据帧,我不理解“在引擎盖下”发生了什么,以及为什么在我的示例中我得到一个空NaN值的数据帧

详细说明及示例:

当我将布尔序列传递给索引运算符时,它将返回与该序列为真的索引对应的行列表:

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值的数据帧,我相信所有的值都转换成NaN,因为你传递了整个df。准确地说,错误“消息”是所有返回的值都是NaN(包括那些不是NaN的值),这使我们能够看到发生了错误。但是,一个更有经验的用户肯定能够更详细地回答您的问题。还要注意,大多数情况下,您希望删除或转换这些NaN,而不仅仅是标记它们

根据我上面的评论和LoukasPap的回答,下面是一种标记、计数,然后删除或转换这些NaN值的方法:

test_df.isnull()
test_df.isnull().sum() # sum NaN by column
test_df.isnull().sum().sum() # get grand total of NaN
第一个标志NaN值:

test_df.isnull()
test_df.isnull().sum() # sum NaN by column
test_df.isnull().sum().sum() # get grand total of NaN
您可能还对计算NaN值感兴趣:

test_df.isnull()
test_df.isnull().sum() # sum NaN by column
test_df.isnull().sum().sum() # get grand total of NaN
现在可以按行删除NaN值

test_df.dropna()
或按列:

test_df.dropna(axis=1)
或用中位数替换NaN值:

test_df.fillna(test_df.median())

test\u df[…]
调用索引方法。从源代码:

def\uuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
...
#我们有(布尔)数据帧吗?
如果isinstance(键、数据帧):
返回self.where(键)
#我们有(布尔)1d索引器吗?
如果com.is\u bool\u索引器(键):
返回self.\u getitem\u bool\u数组(键)
如您所见,如果
键是布尔数据帧,它将调用。
where()
的功能是将条件为
False
的值默认替换为
NaN

# 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\u df.where(test\u df.isnull())
NaN

替换非空值
test\u df.isna()
是否返回所需结果?发布预期结果。我相信(但请等待更有经验的用户或LoukasPap的回答)正是因为您传递了整个df,它只返回NaN。通常,在我的回答中,您会过滤(或转换)这些NaN值。错误“消息”恰恰是所有返回的值都是NaN,包括那些不是NaN的值,因此允许我们看到发生了错误。不还编辑了我关于如何计算NaN的回答。Louis想知道为什么它不抛出错误,或者为什么它显示一个充满NaN的数据帧。