Python技术实现:为DataFrame列首词非BP的行添加BP前缀
Pandas:给非BP开头的字符串添加前缀BP
问题场景
需要处理DataFrame的cat列:
- 若字符串首词不是
BP,在开头插入BP - 首词已是
BP则保持原样
输入示例:
import pandas as pd df = pd.DataFrame({ 'cat': ['BP STATION', 'STATION', 'BP OLD', 'OLD OLD'], })
你原来的代码df['cat'] = df['cat'].str.replace(r'^\w+', 'BP')存在问题:它会把所有行的第一个单词直接替换成BP,导致OLD OLD被错误修改为BP OLD,而非预期的BP OLD OLD。
预期输出:
cat 0 BP STATION 1 BP STATION 2 BP OLD 3 BP OLD OLD
正确写法
方法1:条件判断+矢量化赋值
用str.startswith筛选出不以BP 开头的行,直接拼接前缀:
# 生成掩码:找出所有不是BP开头的行 mask = ~df['cat'].str.startswith('BP ') # 给这些行添加BP前缀 df.loc[mask, 'cat'] = 'BP ' + df.loc[mask, 'cat']
方法2:正则负向前瞻
用正则匹配非BP开头的位置,插入前缀:
df['cat'] = df['cat'].str.replace(r'^(?!BP\s)', 'BP ', regex=True)
(?!BP\s)是负向前瞻断言,确保只在不是以BP加空格开头的位置插入BP ,不会影响原本符合要求的行。
方法3:apply lambda(简单直观)
如果数据量不大,用lambda表达式实现逻辑更清晰:
df['cat'] = df['cat'].apply(lambda s: s if s.startswith('BP ') else f'BP {s}')
效果验证
执行以上任意代码后,df['cat']都会得到符合预期的结果。
内容的提问来源于stack exchange,提问作者jonboy
相关产品推荐
相关产品推荐

