Python 如果列中的值更改,则删除行

Python 如果列中的值更改,则删除行,python,pandas,Python,Pandas,假设我有以下数据帧: my_class value 0 1 1 1 1 2 2 1 3 3 2 4 4 2 5 5 2 6 6 2 7 7 2 8 8 2 9 9 3 10 10 3 11 11 3 12 我想确定“my_类”的索引,在该索引之后和之前,类在其

假设我有以下数据帧:

   my_class  value
0      1      1
1      1      2
2      1      3
3      2      4
4      2      5
5      2      6
6      2      7
7      2      8
8      2      9
9      3     10
10     3     11
11     3     12
我想确定“my_类”的索引,在该索引之后和之前,类在其中更改并删除n行。此示例的输出(n=2)应如下所示:

   my_class  value
0      1      1
5      2      6
6      2      7
11     3     12
我的做法:

# where class changes happen
s = df['my_class'].ne(df['my_class'].shift(-1).fillna(df['my_class']))

# mask with `bfill` and `ffill`
df[~(s.where(s).bfill(limit=1).ffill(limit=2).eq(1))]
输出:

    my_class  value
0          1      1
5          2      6
6          2      7
11         3     12
      my_class  value
  0        1      1
  5        2      6
  6        2      7
  11       3     12

可能的解决办法之一是:

  • 利用索引包含连续整数的事实
  • 查找类更改的索引值
  • 对于每个这样的索引,从n-2生成一系列索引 到n+1并将它们连接起来
  • 检索索引不在此列表中的行
执行此操作的代码是:

ind = df[df['my_class'].diff().fillna(0, downcast='infer') == 1].index
df[~df.index.isin([item for sublist in
    [ range(i-2, i+2) for i in ind ] for item in sublist])]
输出:

    my_class  value
0          1      1
5          2      6
6          2      7
11         3     12
      my_class  value
  0        1      1
  5        2      6
  6        2      7
  11       3     12

你试过什么了吗?我可以使用for循环和遍历列的循环来查找更改并删除行,但是我想避免for循环,因为我的数据集比这个示例大得多。