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

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的冗余行,完全匹配需求:

IDNameScore
1Minnesota P2342
2Vermont P7342
4New Mexico643
6North Dakota P9245
7Texas P5856
8Minnesota LP342

方案说明

  • 正则匹配加了字符串末尾锚定,不会误识别名称中间出现的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:15