如何基于Pandas DataFrame单列值的特定序列删除指定记录
实现思路
- 先通过正则定义两种目标格式的匹配规则,同时提取格式中的数值x、y用于校验一致性:
^null,null,(\d+),(\d+)$匹配null,null,x,y格式,捕获x、y值^(\d+),(\d+),null,null$匹配x,y,null,null格式,捕获x、y值
- 用大小为3的滑动窗口遍历
value列,逐一校验连续3行是否符合「null,null,x,y」→「x,y,null,null」→「null,null,x,y」的序列,且三个值中的x、y完全一致 - 所有匹配成功的序列,将对应后两行的索引加入待删除集合
- 最终过滤原表删除待删除索引的行,得到处理结果
可运行代码示例
import pandas as pd import re # 正则匹配规则 pattern_null_start = re.compile(r'^null,null,(\d+),(\d+)$') pattern_null_end = re.compile(r'^(\d+),(\d+),null,null$') # 此处可替换为你的数据读取逻辑,例如 pd.read_csv("数据文件路径") df = pd.DataFrame( data=[ ["seed", "57", "2021-08-01 09:49:23"], ["ghy", "869", "2021-08-02 09:50:12"], ["repo", "5324", "2021-09-03 10:49:23"], ["repo", "null", "2021-09-03 11:49:23"], ["harv", "12", "2021-09-05 09:43:23"], ["weig", "5,37,12", "2021-09-06 09:25:12"], ["repo", "null,null,4,8", "2021-09-07 09:12:23"], ["repo", "4,8,null,null", "2021-09-07 10:49:23"], ["repo", "null,null,4,8", "2021-09-08 17:49:23"], ["repo", "4,8,1,3", "2021-09-09 12:12:23"], ["repo", "1356", "2021-09-10 12:49:23"] ], columns=["事件(event)", "值(value)", "时间(time)"] ) drop_indexes = set() total_rows = len(df) # 滑动窗口匹配序列 for idx in range(total_rows - 2): val_0 = df.iloc[idx]["值(value)"] val_1 = df.iloc[idx + 1]["值(value)"] val_2 = df.iloc[idx + 2]["值(value)"] # 校验第一个值格式并提取x、y match_0 = pattern_null_start.match(val_0) if not match_0: continue x, y = match_0.groups() # 校验第二个值格式和x、y一致性 match_1 = pattern_null_end.match(val_1) if not match_1 or match_1.groups() != (x, y): continue # 校验第三个值格式和x、y一致性 match_2 = pattern_null_start.match(val_2) if not match_2 or match_2.groups() != (x, y): continue # 匹配成功,标记后两行待删除 drop_indexes.add(idx + 1) drop_indexes.add(idx + 2) # 生成结果表 result_df = df.drop(drop_indexes).reset_index(drop=True) print(result_df)
结果说明
第一个示例数据运行后,会删除2021-09-07 10:49:23、2021-09-08 17:49:23对应的两行,输出与预期一致。第二个示例因为未匹配到完整的三段序列,无行被删除,输出与原表一致。
内容的提问来源于stack exchange,提问作者sdom
相关产品推荐
相关产品推荐

