新手 Pandas 关于DataFrame
中 bool 选择的问题。假设我有以下内容,我想获取所有 > 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 返回一个元素 View ,其中括号中的表达式计算结果为 True。然而,检查第一个语句的 LHS 表明,对于选择语句为 False
的元素,它返回 NaN
。我错过了什么?
最佳答案
您缺少的是,Python 中的索引语句可以根据其位于赋值的右侧还是左侧而具有不同的含义。对于您的情况:
s[np.abs(s) > 1] = np.sign(s) * 3
这会导致调用pd.DataFrame.__setitem__(s, np.abs(s) > 1, np.sign(s) * 3)。由于
np.abs(s) > 1仅在某些单元格中返回 True,Pandas 实现
setitem()` 来仅修改这些单元格。这只是一个有用的约定——Python 语言本身没有强制执行它。
另一方面,如果你说:
print(s[np.abs(s) > 1])
这会导致调用pd.DataFrame.__getitem__(s, np.abs(s) > 1)
。 Pandas 通过返回一个与 s
形状相同但用 NAN
填充“缺失”值的 DataFrame 来实现这一点。
因此,当您进行分配时,不要想象 Pandas 正在创建一个具有 NAN 值且条件为 False 的 DataFrame,然后分配给该 DataFrame。事实并非如此。只要条件为 True,它就会将右侧的值复制到左侧。
关于python - bool 选择和屏蔽赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583609/