Python : 如何在一组行中找到一个元素小于1而另一个大于1?

2 投票
1 回答
1207 浏览
提问于 2025-04-28 23:12

我正在绞尽脑汁想办法实现这样的功能。

我有一个数据框,看起来是这样的……

                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

我想找出那些行,满足以下条件:

一个元素大于1,另一个小于1,或者反过来

这里不在乎小于1和大于1的顺序。不过,重要的是比较必须在同一列中,并且是连续的。我想统计数据框中每一列满足这种条件的所有出现次数。

所以输出的结果应该像这样:

      A B C D E 
index 4 2 5 4 1

我试着考虑用循环来逐行处理并不断累加,但我觉得应该有更好的方法来从数据框中选择数据。

这个问题已经有人回答了,但正如约翰所建议的,包含伪代码和列名。

对于每一行,如果这一行小于1并且前一行大于1,或者这一行大于1并且前一行小于1,就进行计数。

我想检查的是,是否可以避免双向检查,因为本质上是在同一列中寻找正负组合。

附言:我在检查这个数据集的均值回归趋势。

暂无标签

1 个回答

3

在尝试一些复杂的东西之前,我发现先把简单的版本说清楚是有帮助的。我们只用布尔比较、shift 操作,以及我们可以通过把布尔列相加来计算 True 的数量,因为 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% 的信心。)

撰写回答