python - bool 选择和屏蔽赋值

标签 python pandas numpy

新手 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/

相关文章:

python - 使用 nltk 雪球词干分析器将列中的值作为参数传递

python - 将列表拆分为单独的单词

Python合并两个数据框(模糊匹配,有些列完全匹配,而有些列不匹配)

python - Scipy fmin_slsqp 错误 "failed in converting 8th argument ` g' of _slsqp.slsqp to C/Fortran array"

numpy - 分段函数和 numpy 模块的 sympy.lambdify 错误

python - 将 curl 翻译成 python urllib2

python - 如何在 Python pathlib.Path 前加上另一个路径?

python - anaconda3 的一半有 py27 构建路径

python - 如何使用 numpy.fromfile 检测 EOF

python - 解压数据帧值中的集合并复制到行中