基于正则表达式处理Pandas DataFrame的PN列,生成DOB列与异常数据标记列
基于正则表达式处理Pandas DataFrame的PN列,生成DOB列与异常数据标记列
嘿,这事儿好办!咱们用Pandas结合正则表达式就能轻松搞定,既能提取出正确的出生日期(YYMMDD),又能把有问题的数据标记出来,还不会丢失任何原始数据~
第一步:先构造你的示例数据
首先咱们把你给出的示例数据转换成Pandas DataFrame,方便后续处理:
import pandas as pd # 构造示例数据 data = { "PN": ["800204-1567", "470205-1368", "550107-Y001"], "Analysis": ["240508", "220608", "230608"] } df = pd.DataFrame(data)
第二步:编写处理逻辑
接下来我们用正则表达式实现两个需求:提取正确的DOB列,标记有问题的Problem列:
# 提取PN列中前6位纯数字作为DOB,不符合的返回空字符串 df["DOB"] = df["PN"].str.extract(r'^(\d{6})-', expand=False).fillna("") # 标记不符合「6位数字-4位数字」格式的PN数据,符合的留空 df["Problem"] = df["PN"].where(~df["PN"].str.match(r'^\d{6}-\d{4}$'), "")
第三步:查看处理结果
运行上面的代码后,你的DataFrame就会变成想要的样子:
| PN | Analysis | DOB | Problem |
|---|---|---|---|
| 800204-1567 | 240508 | 800204 | |
| 470205-1368 | 220608 | 470205 | |
| 550107-Y001 | 230608 | 550107 | 550107-Y001 |
代码逻辑解释
- 提取DOB列:
str.extract(r'^(\d{6})-', expand=False)会匹配以6位数字开头、后面紧跟-的片段,提取这6位数字作为出生日期;如果前6位不是纯数字或者没有-,就会返回NaN,我们用fillna("")把空值转换成空字符串,让表格更整洁。 - 标记Problem列:
str.match(r'^\d{6}-\d{4}$')会检查PN是否完全符合「6位数字-4位数字」的标准格式,~表示取反,where方法会把不符合格式的PN保留在Problem列,符合格式的则设为空字符串。
如果你的错误判断标准只是「前6位包含字母」,那可以把Problem列的代码改成这样:
# 仅标记前6位不是纯数字的PN数据 df["Problem"] = df["PN"].where(~df["PN"].str[:6].str.isdigit(), "")
备注:内容来源于stack exchange,提问作者Sofie
相关产品推荐
相关产品推荐

