如何根据一列的值和该列中的下一个值过滤数据框的行

时间:2019-09-18 16:34:42

标签: python pandas dataframe filter

我有一个名为“ df”的数据框,在该数据框中有一个我们可以称为“ col”的列。

基于“ col”中的值,我需要在数据帧中仅保留(过滤)col [i]与col [i + 2]值不同且col [i +相同的值1]。确实,该列中具有相同值的序列是倒数第二个。

如果我有

Index  a   b   col
0      34  56   1 
1      45  23   1
2      11  17   1
3      45  67   2
4      12  12   2
5       1   3   3
6      98  12   3

我需要:

1      45  23   1
3      45  67   2
5       1   3   3

我使用以下代码:

def penultimate(df, col):
    d = pd.DataFrame()
    for i in range(1, len(df.index)-2):
       if((df[col].iloc[i] != df[col].iloc[i + 2]) and (df[col].iloc[i] == df[col].iloc[i + 1])):
            d = d.append(df.loc[i])
    return d

它可以工作,但是对于大数据帧来说太慢了。有一种方法可以更快地做到这一点?

谢谢

1 个答案:

答案 0 :(得分:1)

只需两次使用.shift并进行向量化比较==

df[(df.col == df.col.shift(-1)) & (df.col != df.col.shift(-2))]

   Index   a   b  col
1      1  45  23    1
3      3  45  67    2
5      5   1   3    3