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循环,因为我的数据集比这个示例大得多。