Pandas:np.where 在数据帧上有多个条件

Posted

技术标签:

【中文标题】Pandas:np.where 在数据帧上有多个条件【英文标题】:Pandas: np.where with multiple conditions on dataframes 【发布时间】:2015-02-27 07:21:14 【问题描述】:

大家好,我翻遍了 SO 和 google,但找不到类似的东西......

我有一个数据框 x(基本上由一行和 300 列组成)和另一个大小相同但数据不同的数据框 y。我想修改 x 使其为 0,如果它与 y 有不同的符号并且 x 本身不是 0,否则保持原样。所以这需要在多个条件下使用 np.where 。但是,我看到的多个条件示例都使用标量,当我使用相同的语法时,它似乎不起作用(最终将 -everything- 设置为零,没有错误)。我担心隐藏在某处或其他地方的引用分配问题(转移后 y 是 x,但据我所知,此代码上方没有上游问题)有什么想法吗?

我要调试的代码是:

tradesmade[i:i+1] = np.where((sign(x) != sign(y)) & (sign(x) != 0), 0, x) 

它只返回一堆零。我也试过了

tradesmade[i:i+1][(sign(x) != sign(y)) * (sign(x) != 0)] = 0

但这似乎也不起作用。我已经在这几个小时了,完全不知所措。请帮忙!

【问题讨论】:

为什么要使用单行 300 列的 DataFrame 而不是 Series? 哈哈,是的,我应该预料到这个问题。我实际上正在迭代该数据帧的> 3000行,但是每次计算都取决于先前行的结果,因此必须一次走一行。我知道向量化的重要性和速度,但优先考虑得到答案(我似乎也没有成功......) 子句sign(x) != 0 是不必要的。 【参考方案1】:

y 元素等于零时,我不清楚您究竟要做什么......无论如何,这个答案的关键点是“使用np.logical_and,not,or,xor 函数” .

认为以下内容虽然与您的示例不同,但可以满足您的需求,但如果我错了,您应该能够结合不同的测试来实现您想要的,

x = np.where(np.logical_or(x*y>0, y==0), x, 0)

【讨论】:

您花了很长时间才认识到我的答案绝对伟大,但最终您接受了它! ... 说真的:感谢您抽出宝贵的时间回去勾选我的这个答案... 哈哈我当时不是一个非常活跃的 SO 用户。因为我在回复你的评论时又做了一次。我想知道我们能坚持多久【参考方案2】:

类似于@gboffi 的帖子,但根据我的理解尝试更集中于您的原始请求:

x = np.where(np.logical_and((x*y) < 0, x != 0))

x = np.where(((x*y) < 0) & (x != 0)))

【讨论】:

以上是关于Pandas:np.where 在数据帧上有多个条件的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个参数的 pandas 数据帧上应用滚动函数

如何在聚合的 pandas 数据帧上运行多个函数

嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据

在 pandas 数据帧上并行调用函数

使用 np.where() 在 pandas 数据框中将 True/False 值更改为离散值

在 pandas 多索引数据帧上绘制两个级别的 x_ticklabels [重复]