提问者:小点点

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


假设我有以下数据:

   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

我想标识类更改的“class”的indizes,并移除此索引之后和之前的n行。 此示例(n=2)的输出应如下所示:

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

共2个答案

匿名用户

我的做法:

# 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

匿名用户

一个可能的解决办法是:

  • 查找类更改的索引值。
  • 为每个这样的索引生成一个从n-2到n+1的索引序列,并将它们连接起来。
  • 检索索引不在此列表中的行。

执行此操作的代码如下:

ind = df[df['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])]