当一列满足另一列的特定条件时,是否有一种方法可以迭代地找到数据帧的索引?

时间:2018-10-23 00:03:40

标签: python python-3.x pandas dataframe

我有一个以ReadTime作为索引的熊猫数据帧,如下所示:

  ReadTime    A       B
2/4/18 0:00 6008.6  6013.55
2/4/18 0:01 6008.65 6013.6
2/4/18 0:02 6009.15 6014.05
2/4/18 0:03 6014.00 6014.1
2/4/18 0:04 6009.1  6013.7
2/4/18 0:05 6008.75 6013.65
2/4/18 0:06 6008.7  6013.25
2/4/18 0:07 6008.3  6013.25
2/4/18 0:08 6015.00 6013
2/4/18 0:09 6008.3  6003.55
2/4/18 0:10 6008.65 6013.65
2/4/18 0:11 6008.75 6013.6
2/4/18 0:12 6008.7  6013.7
2/4/18 0:13 6008.65 6013.55
2/4/18 0:14 6014.00 6013.3
2/4/18 0:15 6008.6  6013.5
2/4/18 0:16 6008.55 6013.4
2/4/18 0:17 6008.55 6013.55
2/4/18 0:18 6008.65 6013.55
2/4/18 0:19 6018    6013.6

我想反复检查A中的值是否大于B中的值,并创建一个带有时间戳的新数据帧。使用满足先前条件的时间戳重复分析。

示例结果如下:

  ReadTime      C
2/4/18 0:00 2/4/18 0:03
2/4/18 0:03 2/4/18 0:08
2/4/18 0:08 2/4/18 0:14
2/4/18 0:14 2/4/18 0:19

非常感谢您的帮助。

编辑: C列表示满足条件的时间戳。 (即,考虑到时间戳记中的值,A中的值大于或等于B中的值。例如:在2/4/18 0:00,B的值为6013.55。因此,在该时间戳记之后遍历A中的值,我们可以看到,在2/4/18 0:03,A的值为6014,超过了B的值(6013.55)。因此,将2/4/18 0:03带入C中,对应于2/4 / 18 0:00。

1 个答案:

答案 0 :(得分:0)

这是(如果我理解正确的话)一种解决方案:

import numpy as np
df['C'] = np.where(df.A > df.B, df.index, np.nan).bfill().shift(-1)
df['X'] = (df.A > df.B).cumsum()
df = df.drop_duplicates(subset=['X'], keep='first')
df = df[['C']]

首先,我们用满足条件的行的时间戳填充名为C的列,并将NaN放在其他位置。我们对它进行回填,以便所有先前的行都具有相同的时间戳(直到最后一次满足条件的时间戳)。然后,我们向后移动一行(为下一步做准备)。

为了使索引与所需的方式对齐,我们需要对行进行分组。我们可以通过结合您的条件和cumsum()来完成此操作,其中将True视为1,将False视为0。现在,我们可以删除组中的所有行(它们在C中具有相同的时间戳),但第一行除外。这应该给您想要的输出。

注意:您所需的输出与您的输入不匹配(在2/4/18 0:03处,B大于但不小于A),因此答案与“与您的榜样完美匹配。但是我想我已经明白了您要问的问题-如果我是对的,请更正问题;如果我错了,请发表评论,然后更改答案。