Pandas中的布尔选择和蒙版赋值

时间:2018-03-31 02:22:13

标签: python pandas numpy

关于DataFrame中布尔选择的新手大熊猫问题。假设我有以下内容,我希望将> 1的所有条目都设置为3

import numpy as np
import pandas as pd

s = pd.DataFrame(data=np.random.randn(10, 4), index=np.arange(10),
              columns=["a", "b", "c", "d"])

s[np.abs(s) > 1] = np.sign(s) * 3

RHS与LHS的形状不同,为什么这种方法很好,我不需要做

s[np.abs(s) > 1] = np.sign(s[np.abs(s) > 1]) * 3

我的理解是这两个表达式的LHS都返回括号中的表达式求值为True的元素的视图。但是,检查第一个语句的LHS会显示它为选择语句为NaN的元素返回False。我错过了什么?

1 个答案:

答案 0 :(得分:3)

您缺少的是,Python中的索引语句可能具有不同的含义,具体取决于它是在作业的RHS还是LHS上。在你的情况下:

s[np.abs(s) > 1] = np.sign(s) * 3

这导致调用pd.DataFrame.__setitem__(s, np.abs(s) > 1, np.sign(s) * 3). And since np.abs(s)> 1 returns True only in certain cells, Pandas implements setitem ()`仅修改这些单元格。这只是一个有用的约定 - Python语言中的任何内容都不会强制执行它。

另一方面,如果你说:

print(s[np.abs(s) > 1])

这会调用pd.DataFrame.__getitem__(s, np.abs(s) > 1)。并且Pandas通过返回与s具有相同形状的DataFrame来实现此功能,但“{missing”值填充了NAN

因此,当您执行赋值时,不要想象Pandas正在创建具有NAN值的DataFrame,其中条件为False,然后分配给该DataFrame。这不是发生的事情。只要条件为True,它就会将值从RHS复制到LHS。