关于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
。我错过了什么?
答案 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。