如何在 Pandas 中对每行进行条件检查

3

我有一个包含一些数值的数据框,就像这样:

   col1  col2
0     1     3
1    -2    -4
2     3    -5

我希望有一个包含以下内容的col3
1 - 如果该行中所有值都大于0,
-1 - 如果该行中所有值都小于0,以及
0 - 对于所有其他情况

因此,我的结果df应该看起来像这样:

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

请帮我找出在Pandas和/或Numpy中实现此操作的最Pythonic方法。

3个回答

3
使用 numpy.select()
df['col3']=np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

根据文档,解释如下:

numpy.select(condlist, choicelist, default=0)

根据条件列表,从choicelist中返回一个数组。

这里的条件列表是(df.gt(0).all(axis=1))(df.lt(0).all(axis=1)),它们检查了您提到的2个条件。 (最好的做法是打印条件来检查输出)。然后我们按顺序放置选择,这里是1和-1。 最后一个参数是默认值,如果需要其他默认值,则可以指定。

性能:

%timeit np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
#414 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

谢谢您的回答。我尝试查阅了 np.select 的文档,但仍然无法正确理解它。请问您能否解释一下它是如何工作的? - Somnath Rakshit
@SomnathRakshit 我已经更新了我的答案并附上了简要说明。如果您觉得这个答案有帮助,请考虑点赞和接受这个答案。谢谢。 - anky

1
另一种解决方案是:


df = pd.DataFrame([[1, 3], [-2, -4], [3, -5]], columns=['col1', 'col2'])
df['col3'] = df.gt(0).all(axis=1) * 1 - df.lt(0).all(axis=1) * 1
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

1
您也可以使用df.all()
df['col3'] = (df > 0).all(axis=1) * 1 + (df < 0).all(axis=1) * -1

print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

我喜欢这种方法。但是第三个条件如何工作,它将默认值设置为0?在数据框中,0是默认值吗? - Somnath Rakshit
对于第三种情况,两个产品都将返回0(只有其中一个“all()”调用将返回true,或者两个都是false)。因此它将是0 + 0。 - ernest_k
啊,没错。但是假设col3需要设置为字符串而不是数字,例如用“Positive”代替1,“Negative”代替-1和“Undecided”代替0。那么怎么使用呢? - Somnath Rakshit
@SomnathRakshit 有很多方法可以做到这一点。我想到的一个方法是对这个结果应用lambda函数。 - ernest_k

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