Python:如何在行集中查找,一个元素小于1而另一个元素大于1?

时间:2014-10-22 03:32:52

标签: python pandas

我正在摸索着弄清楚我怎么能做这样的事情。

我有一个看起来像这样的数据框......

                A           B           C           D           E
1/2/2012 9:18   0.997558702 1.001294498 1.004264524 1.002337408 1.003628447
1/2/2012 9:19   1.004805553 1.001939237 1.002523232 1.001323543 1.003615329
1/2/2012 9:20   1.001151359 1.001290323 0.997728668 0.999937057 1
1/2/2012 9:21   1.001680821 1.003221649 1.001661232 1.000220313 1.003746398
1/2/2012 9:22   0.998454473 0.998715478 0.998095823 0.996286973 0.996985357
1/2/2012 9:23   0.996461899 0.99903537  1.00055388  0.999778915 0.997408207
1/2/2012 9:24   1.002174781 0.999034438 1.000492065 1.001232033 0.997978923
1/2/2012 9:25   0.999379982 1.00064433  0.998708963 1.000063103 0.999855345

我想找出哪些行 sets where one element is > 1 and other is < 1 or reverse &lt; 1或&gt; 1的顺序无关紧要。虽然重要的是比较在同一列和连续时间内。我希望按列显示所有此类事件的数据框

输出类似

的内容
      A B C D E 
index 4 2 5 4 1

我试图在循环中思考并继续添加,但不知何故认为应该有更好的方法从数据框中进行选择。

这个问题已得到解答,但正如约翰建议的那样包含伪代码和列名。     对于每行,如果行&lt; 1和row.shift(1)&gt; 1或行&gt; 1和row.shift(1)&lt; 1 1         计数

我试图检查的是,我是否可以避免双向检查,因为基本上它的发现+ ve -ve组合在列中。

P.S&GT;&GT;我正在检查此数据集的均值回归趋势。

1 个答案:

答案 0 :(得分:3)

在尝试任何聪明的事情之前,我发现说出直截了当的版本会有所帮助。仅使用布尔比较shift,以及我们可以对布尔列进行求和以得到真值数量int(True) == 1的事实,我们可以这样做:

>>> (((df < 1) & (df.shift() > 1)) | ((df > 1) & (df.shift() < 1))).sum()
0    4
1    2
2    5
3    4
4    1
dtype: int64

使用类似于

的布尔框架
>>> (df < 1) & (df.shift() > 1)
                   0      1      2      3      4

1/2/2012 9:18  False  False  False  False  False
1/2/2012 9:19  False  False  False  False  False
1/2/2012 9:20  False  False   True   True  False
1/2/2012 9:21  False  False  False  False  False
1/2/2012 9:22   True   True   True   True   True
1/2/2012 9:23  False  False  False  False  False
1/2/2012 9:24  False  False  False  False  False
1/2/2012 9:25   True  False   True  False  False

我觉得相对容易阅读。


一个有点光滑的版本 - 虽然,老实说,可能太过光滑了 - 可能就像

>>> s = np.sign(df - 1)
>>> (s == -s.shift()).sum()
0    4
1    2
2    5
3    4
4    1
dtype: int64

但是很难看出这是符合它应有的。 (我写了它,我只有85%的自信。)