Python pandas如何删除Name列中对应Model子串后的多余文本内容
问题原因
- 列名大小写不匹配:你代码中使用的
name、model为小写,而实际DataFrame的列名为首字母大写的Name、Model,pandas区分列名大小写,这是第一个问题。 partition参数逻辑错误:df["Model"].to_string()会将整个Model列转换为包含索引、换行符的完整长字符串,并不是每行对应使用该行的Model值作为分隔符,所以每行的Name列内容根本找不到这个全局长分隔符,自然不会有任何修改效果。
实现方案
方案1:逐行处理(适合小数据量,逻辑直观)
通过apply遍历每一行,找到当前行Model值在Name中的结束位置,直接截取前缀即可:
import pandas as pd # 构造测试数据 df = pd.DataFrame([['ABC-12(s)', 'Some text ABC-12(s) wrong text'], ['ABC-45', 'Other text ABC-45 garbage text'], ['XYZ-LL', 'Another text XYZ-LL unneeded text']], columns = ['Model', 'Name']) # 逐行截取到Model值结束的位置 df['Name'] = df.apply(lambda row: row['Name'][:row['Name'].find(row['Model']) + len(row['Model'])], axis=1)
方案2:向量化正则匹配(适合大数据量,性能更高)
将所有Model值转义后拼接为正则捕获组,直接提取Name中从开头到匹配到对应Model值的部分:
import pandas as pd import re # 构造测试数据 df = pd.DataFrame([['ABC-12(s)', 'Some text ABC-12(s) wrong text'], ['ABC-45', 'Other text ABC-45 garbage text'], ['XYZ-LL', 'Another text XYZ-LL unneeded text']], columns = ['Model', 'Name']) # 构造匹配所有Model值的正则,先做转义避免Model中的特殊字符(如括号)影响正则匹配 model_reg = '(' + '|'.join(df['Model'].apply(re.escape)) + ')' # 提取从开头到匹配到Model值的所有内容 df['Name'] = df['Name'].str.extract(rf'(.*?{model_reg})', expand=False)
两种方案处理后都可以得到预期结果:
| index | Model | Name |
|---|---|---|
| 0 | ABC-12(s) | Some text ABC-12(s) |
| 1 | ABC-45 | Other text ABC-45 |
| 2 | XYZ-LL | Another text XYZ-LL |
内容的提问来源于stack exchange,提问作者Lauris Kārkliņš
相关产品推荐
相关产品推荐

