在dataframes Python中选择公共元素

在dataframes Python中选择公共元素,python,pandas,Python,Pandas,我有3个DFs,我希望找到具有共同方向的所有单元格(即始终为正或始终为负,跨DFs): 结果应该是3个数据帧,其中不一致的元素显示NAs。例如,对于test1,它将是: test=pd.DataFrame([[NA,1,NA,3], [NA,NA,NA,2], [2,1.5,-3,1]], columns=['a','b','c','d'] )

我有3个DFs,我希望找到具有共同方向的所有单元格(即始终为正或始终为负,跨DFs):

结果应该是3个数据帧,其中不一致的元素显示NAs。例如,对于
test1
,它将是:

test=pd.DataFrame([[NA,1,NA,3],
                   [NA,NA,NA,2],
                   [2,1.5,-3,1]],
                  columns=['a','b','c','d']
                   )
注意,不考虑0(即,导致NA)。 我可以一个细胞一个细胞地做,但我想知道这是否可能在将来做 一次完成整个数据帧

我试着做
((test>0)和(test1>0)和(test2>0))
这是可行的,但我不能将其与否定项合并


提前非常感谢

您可以使用
np。签名
并添加相等测试,然后
其中
执行此操作:

 test.where(np.sign(test).add(np.sign(test2)).add(np.sign(test3)).abs() == 3)
输出:

     a    b    c  d
0  NaN  1.0  NaN  3
1  NaN  NaN  NaN  2
2  2.0  1.5 -3.0  1

一种稍有不同的方法-您可以将底层数组堆叠在一起,使用
np.sign
,然后在添加的维度上求和并减少,以生成
df.where
的掩码

In [58]: m, n = test.shape

In [59]: signs = np.sign(np.dstack((test, test2, test3)))

In [60]: mask = np.abs(np.sum(signs, -1)) == m

In [61]: test.where(mask)
Out[61]: 
     a    b    c  d
0  NaN  1.0  NaN  3
1  NaN  NaN  NaN  2
2  2.0  1.5 -3.0  1
In [58]: m, n = test.shape

In [59]: signs = np.sign(np.dstack((test, test2, test3)))

In [60]: mask = np.abs(np.sum(signs, -1)) == m

In [61]: test.where(mask)
Out[61]: 
     a    b    c  d
0  NaN  1.0  NaN  3
1  NaN  NaN  NaN  2
2  2.0  1.5 -3.0  1