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 在数据帧上有多个条件的主要内容,如果未能解决你的问题,请参考以下文章
嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据