根据前几行的值从数据框中过滤行

52g*_*g44 7 python dataframe python-3.x pandas

我有一个如下数据框:

    A
1   1000
2   1000
3   1001
4   1001
5   10
6   1000
7   1010
8   9
9   10
10  6
11  999
12  10110
13  10111
14  1000 
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过以下方式清理数据框:对于具有大于前一行值的1.5倍或小于前一行值的0.5倍的每一行,请将其删除。但是,如果前一行是拖放行,则必须与紧邻的前一个非拖放行进行比较。(例如,我的数据帧中的索引9、10或13)因此,最终的数据帧应类似于:

    A
1   1000
2   1000
3   1001
4   1001
6   1000
7   1010
11  999
14  1000
Run Code Online (Sandbox Code Playgroud)

我的数据框确实很大,因此性能值得赞赏。

piR*_*red 6

您无法避免遍历每一行

提示
  • 避免为每一行创建新的(昂贵的)对象
  • 使用高效的内存迭代

我会用发电机

我将一系列传递给一个函数,并产生满足条件的行的索引值。

def f(s):
    it = s.iteritems()
    i, v = next(it)
    yield i                          # Yield the first one
    for j, x in it:
        if .5 * v <= x <= 1.5 * v:
            yield j                  # Yield the ones that satisfy
            v = x                    # Update the comparative value

df.loc[list(f(df.A))]                # Use `loc` with index values
                                     # yielded by my generator

       A
1   1000
2   1000
3   1001
4   1001
6   1000
7   1010
11   999
14  1000
Run Code Online (Sandbox Code Playgroud)