有条件地删除连续的熊猫

时间:2019-03-18 10:49:21

标签: python

我有一个df列(A,B,C,D,F)。我想要: 1)比较连续的行 2)如果连续E <= 1之间的绝对差和连续C> 7之间的绝对差,则删除C值最低的行。 样本数据:

     A       B    C      D       E
0   94.5    4.3  26.0   79.0    NaN
1   34.0    8.8  23.0   58.0    54.5
2   54.2    5.4  25.5   9.91    50.2
3   42.2    3.5  26.0   4.91    5.1
4   98.0    8.2  13.0   193.7   5.5
5   20.5    9.6  17.0   157.3   5.3
6   32.9    5.4  24.5   45.9    79.8

所需结果:

     A       B    C      D       E
0   94.5    4.3  26.0   79.0    NaN
1   34.0    8.8  23.0   58.0    54.5
2   54.2    5.4  25.5   9.91    50.2
3   42.2    3.5  26.0   4.91    5.01
4   32.9    5.4  24.5   45.9    79.8

与第3行相比,第4行已删除。第5行现在为第4行,与第3行相比,它已删除。

此代码以布尔值(不带值的df)返回结果,并且不满足所有条件。

df = (abs(df.E.diff(-1)) <=1 & (abs(df.C.diff(-1)) >7.)

代码结果:

0    False
1    False
2    False
3     True
4    False
5    False
6    False
dtype: bool

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用shift()比较行,并使用while循环进行迭代,直到没有新的更改发生为止:

while(True):
    rows = len(df)
    df = df[~((abs(df.E - df.E.shift(1)) <= 1)&(abs(df.C - df.C.shift(1)) > 7))]
    df.reset_index(inplace = True, drop = True)
    if (rows == len(df)):
        break

它产生所需的输出:

    A       B       C       D       E
0   94.5    4.3     26.0    79.00   NaN
1   34.0    8.8     23.0    58.00   54.5
2   54.2    5.4     25.5    9.91    50.2
3   42.2    3.5     26.0    4.91    5.1
4   32.9    5.4     24.5    45.90   79.8