Pandas: 在数据框中使用多个条件的np.where

7

大家好,我在Stack Overflow和Google上搜索了很久,但都找不到类似的内容...

我有一个数据框x(基本上只包含一行和300列),还有另一个同样大小但数据不同的数据框y。我想修改x,使得当它与y的符号不同时且x本身不为0时,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

但这似乎也不起作用。我已经花了几个小时在这个问题上,完全无法解决。请帮忙!


2
你为什么要使用一个只有一行、300列的DataFrame而不是Series呢? - BrenBarn
哈哈,是的,我应该预料到那个问题。实际上,我正在迭代遍历超过3000行的数据框,但每个计算都依赖于之前行的结果,因此必须逐行进行。我知道向量化的重要性和速度,但优先考虑得到答案(而我似乎也没有成功...)。 - swyx
“sign(x) != 0”的条件是不必要的。 - acushner
2个回答

16

我不清楚您在 y 元素等于零时到底想要做什么……无论如何,这个答案的关键点是“使用 np.logical_{and,not,or,xor} 函数”。

我认为下面的方法可以做到您想要的,虽然它与您的示例表述不同,但如果我错了,您应该能够结合不同的测试来实现您想要的结果。

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

2
你花了相当长的时间才认识到我的答案的绝对优秀之处,但最终你接受了它!……说真的:感谢你抽出时间回来勾选我的答案。 - gboffi
哈哈,那时我不是一个非常活跃的SO用户。自从我回复了你的评论后,我又开始使用它了。我想知道我们能坚持多久。 - swyx

4
类似@gboffi的帖子,但根据我的理解更集中于您的原始请求,请尝试:
x = np.where(np.logical_and((x*y) < 0, x != 0))

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接