如何按键值并根据条件删除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
相关产品推荐
相关产品推荐

