基于R语言按条件拆分列:修正餐食数据meal_code错位问题
解决餐食数据集的meal_code提取与修正问题
问题分析
你的核心需求是从meal字段中提取正确的meal_code,覆盖meal_code列里的错误值。关键约束点:
- 部分餐食名称包含数字,但所有meal_code均为字母开头+数字结尾的短字符串
- 错误行的
meal字段结构是「meal_code + 餐食名称」(如s1 sandwich) - 你之前使用的
sep = "\\s(?=.*\\d)"无效,是因为该正则会匹配所有后跟数字的空格,无法区分餐食名称里的数字和meal_code的数字。
解决方案
利用meal_code「字母开头+数字结尾、位于字段开头」的特征,用Python Pandas实现精准提取:
代码实现
import pandas as pd # 构造数据集 data = { 'visitor': ['ahmed', 'ahmed', 'khaled', 'khaled'], 'meal': ['water', 's1 sandwich', 'fish', '2extra coffee'], 'meal_code': ['w1', 'w1', 'f1', 'c2'] } df = pd.DataFrame(data) # 提取meal_code:匹配开头的字母+数字组合,无匹配则保留原meal_code df['meal_code'] = df['meal'].str.extract(r'^([a-zA-Z]\d)', expand=False).fillna(df['meal_code'])
修正后结果
| visitor | meal | meal_code |
|---|---|---|
| ahmed | water | w1 |
| ahmed | s1 sandwich | s1 |
| khaled | fish | f1 |
| khaled | 2extra coffee | c2 |
补充说明
- 正则
^([a-zA-Z]\d)专门匹配字段开头的字母+数字组合,完美避开餐食名称中以数字开头的内容(如2extra) - 如果meal_code存在多位数字(如
w12),可将正则调整为^([a-zA-Z]\d+) fillna(df['meal_code'])确保正常行的meal_code不受修改
内容的提问来源于stack exchange,提问作者Abdullah Al Sobhi
相关产品推荐
相关产品推荐

