python - 当我将布尔数据帧传递给 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 值的数据帧
解决方案
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()
下条件为的值。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_df.where(test_df.isnull())
用 替换非空值NaN
。
推荐阅读
- r - r - plotting gantt chart where multiple periods exist within one category
- reactjs - Next.JS 中使用 SASS 的背景图像
- python - 如何在 discord.py 中放置多个导致相同响应的命令?
- swift - 实例成员 x 不能用于类型 y
- sql - 带有聚合函数的嵌套 SQL
- sql - 查询以列出日期范围内的所有重复记录
- javascript - 为什么我必须单击两次按钮才能加载图像?
- c - C11标准中常用算术转换的第二部分是什么意思?
- java - 在通用列表中查找和舍入对象
- ruby-on-rails - 如何在rails嵌套路由简单形式中使用部分?