R语言中如何删除列值近似且P后缀数值更低的冗余数据行
最优实现方案
针对该表格清洗需求,性能最高、逻辑最稳妥的实现方式是通过结构化数据处理工具(Python Pandas / SQL 窗口函数)完成,核心思路是先拆分名称字段提取基础名与P后缀数值,再分组筛选保留有效行,全程用向量化运算避免逐行遍历的性能损耗。
以下是可直接运行的Pandas实现代码:
import pandas as pd # 1. 读取数据集,此处用示例数据做演示 df = pd.DataFrame([ [1, "Minnesota P2", 342], [2, "Vermont P7", 342], [3, "Texas P4", 65], [4, "New Mexico", 643], [5, "North Dakota P8", 78], [6, "North Dakota P9", 245], [7, "Texas P5", 856], [8, "Minnesota LP", 342] ], columns=["ID", "Name", "Score"]) # 2. 正则拆分名称:仅匹配字符串末尾为「空格+P+纯数字」的后缀格式 split_pattern = r'^(?P<base_name>.*?)(?: P(?P<p_suffix>\d+))?$' df[["base_name", "p_suffix"]] = df["Name"].str.extract(split_pattern) df["p_suffix"] = pd.to_numeric(df["p_suffix"]) # 后缀值转数值类型,无匹配后缀的记录值为NaN # 3. 按基础名分组,计算每组的最高P后缀值 df["max_p_ver"] = df.groupby("base_name")["p_suffix"].transform("max") # 4. 筛选需要保留的行 # 保留规则:无P数字后缀的记录全部保留;带P数字后缀的记录仅保留同组后缀值最高的行 keep_filter = (df["p_suffix"].isna()) | (df["p_suffix"] == df["max_p_ver"]) clean_df = df[keep_filter].drop(columns=["base_name", "p_suffix", "max_p_ver"]).reset_index(drop=True)
运行后输出的清洗结果如下,已自动删除ID为3、5的冗余行,完全匹配需求:
| ID | Name | Score |
|---|---|---|
| 1 | Minnesota P2 | 342 |
| 2 | Vermont P7 | 342 |
| 4 | New Mexico | 643 |
| 6 | North Dakota P9 | 245 |
| 7 | Texas P5 | 856 |
| 8 | Minnesota LP | 342 |
方案说明
- 正则匹配加了字符串末尾锚定,不会误识别名称中间出现的
P+数字片段,也不会把LP/CP这类P后接非数字的后缀判定为版本号,不会出现误删 - 全程采用Pandas内置向量化运算,无逐行循环逻辑,处理百万行级数据集也可在秒级完成
- 规则兼容性强:如果数据中存在小写p、P和数字之间无空格的格式变体,只需将拆分正则替换为
r'^(?P<base_name>.*?)(?:\s*[pP](?P<p_suffix>\d+))?$'即可适配 - 如果需要在数据库中用SQL实现,逻辑完全一致:通过正则函数拆分基础名和后缀值,用窗口函数
MAX() OVER(PARTITION BY 基础名)计算每组最高版本号,再按相同筛选规则过滤即可
内容的提问来源于stack exchange,提问作者piper180
相关产品推荐
相关产品推荐

