You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按键值并根据条件删除Pandas DataFrame后续记录

按组删除指定条件后的所有记录

我创建了如下Pandas DataFrame:

import pandas as pd

ds1 = {'col1':[1,1,1,1,1,1,1, 2,2,2,2,2,2,2], "col2" : [1,1,0,1,1,1,1,1,1,0,1,1,1,1]}
df1 = pd.DataFrame(data=ds1)

输出如下:

col1  col2
0      1     1
1      1     1
2      1     0
3      1     1
4      1     1
5      1     1
6      1     1
7      2     1
8      2     1
9      2     0
10     2     1
11     2     1
12     2     1
13     2     1

需求是:当col2等于0时,删除同一col1分组下该条记录之后的所有行,最终期望得到的结果如下:

col1  col2
0      1     1
1      1     1
2      1     0
7      2     1
8      2     1
9      2     0

解决方案一:用groupby结合cumany标记过滤

核心逻辑是标记出每个分组中第一个0之后的所有行,然后保留剩下的部分:

# 标记每个分组中第一个0之后的行
mask = df1.groupby('col1')['col2'].apply(lambda x: x.eq(0).shift().fillna(False).cumany())
# 筛选出不需要删除的行
result = df1[~mask]
print(result)

解释:

  • x.eq(0):把col2等于0的位置标记为True
  • .shift():将标记结果向下移动一行,这样第一个0的下一行才会被标记为True
  • .fillna(False):处理分组第一行的空值
  • .cumany():累积逻辑或,确保第一个0之后的所有行都被标记为True
  • ~mask:取反,保留第一个0及之前的所有行

解决方案二:按组截断到第一个0的位置

这种方法更直观,直接找到每个分组中第一个0的索引,然后截断到该位置:

def truncate_group(group):
    zero_rows = group[group['col2'] == 0]
    # 如果分组里有0,就截断到第一个0的位置;没有则保留整个分组
    if not zero_rows.empty:
        first_zero_idx = zero_rows.index[0]
        return group.loc[:first_zero_idx]
    return group

result = df1.groupby('col1', group_keys=False).apply(truncate_group)
print(result)

这个方法兼容性更好,即使某些col1分组里没有0,也不会报错,会完整保留该分组的所有行。

两种方法都能得到你想要的结果,按需选择即可。

内容的提问来源于stack exchange,提问作者Giampaolo Levorato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:38:32