匹配DataFrame的Name与Title列,按v/vs位置标注Label列的first/second标签
实现方案
不需要拆分Title列,直接通过比较Name和分隔符v/vs在字符串中的位置即可实现,核心逻辑是:
- 用正则匹配独立的
v或vs作为分隔符,避免匹配到单词内部的字符 - 分别获取分隔符、Name在Title字符串中的起始索引
- 索引比较:Name索引小于分隔符索引则返回
first,大于则返回second,没有匹配到分隔符或Name不存在于Title中则返回空值
代码实现
import pandas as pd import re # 匹配独立出现的v或vs,可根据需求添加re.IGNORECASE忽略大小写 v_pat = re.compile(r'\bvs?\b') def judge_label(row): # 匹配分隔符位置 v_match = v_pat.search(row['Title']) if not v_match: return pd.NA v_start_idx = v_match.start() # 匹配Name在Title中的位置 name_idx = row['Title'].find(row['Name']) if name_idx == -1: return pd.NA return 'first' if name_idx < v_start_idx else 'second' # 生成Label列 df['Label'] = df.apply(judge_label, axis=1)
性能优化提示
如果你的数据量在百万级以上,可以把临时的位置计算逻辑替换为批量操作,避免逐行apply的遍历开销,性能会提升5-10倍:
# 提前计算分隔符位置 df['v_pos'] = df['Title'].apply(lambda x: v_pat.search(x).start() if v_pat.search(x) else pd.NA) # 提前计算Name位置 df['name_pos'] = df.apply(lambda x: x['Title'].find(x['Name']), axis=1) # 向量化条件赋值 df['Label'] = pd.NA df.loc[df['name_pos'] < df['v_pos'], 'Label'] = 'first' df.loc[df['name_pos'] > df['v_pos'], 'Label'] = 'second' # 清理临时列 df.drop(columns=['v_pos', 'name_pos'], inplace=True)
内容的提问来源于stack exchange,提问作者CodingStark
相关产品推荐
相关产品推荐

