如何在Pandas DataFrame中统一同药品(不同后缀)的Code值
统一同药品的Code值解决方案
核心思路
先提取药品的基础名称(去掉名称后的数字后缀),再通过映射关系把同一基础名称的Code替换成你想要的统一值,既灵活又能保留原Code的直观性。
方法一:手动指定映射(最推荐,完全按需求控制)
步骤1:提取无后缀的基础药品名称
用正则表达式精准去掉名称末尾的数字和前置空格,适配Ibuprofen 378这类带数字后缀的名称格式:
import pandas as pd # 替换成你的实际DataFrame df = pd.DataFrame({ 'Name': ['Ibuprofen 378', 'Ibuprofen 1992', 'Paracetamol 500', 'Paracetamol 1000', 'Aspirin'], 'Code': ['MOTR', 'ADVL', 'PARA', 'PARX', 'ASPR'], 'Amount': [10, 20, 15, 5, 8], 'Seller': ['A', 'B', 'C', 'D', 'E'] }) # 提取基础名称:剔除末尾的数字部分 df['Base_Name'] = df['Name'].str.replace(r'\s+\d+$', '', regex=True)
步骤2:定义映射关系并替换Code
根据需求自定义每个基础名称对应的目标Code,未指定的药品会保留原Code:
# 键是基础名称,值是你要统一的目标Code code_mapping = { 'Ibuprofen': 'ADVL', # 把所有Ibuprofen相关的Code换成ADVL 'Paracetamol': 'PARA' # 把所有Paracetamol相关的Code换成PARA } # 替换Code列,未在映射中的条目保持原Code不变 df['Code'] = df['Base_Name'].map(code_mapping).fillna(df['Code'])
处理后结果示例:
| Name | Code | Amount | Seller | Base_Name |
|---|---|---|---|---|
| Ibuprofen 378 | ADVL | 10 | A | Ibuprofen |
| Ibuprofen 1992 | ADVL | 20 | B | Ibuprofen |
| Paracetamol 500 | PARA | 15 | C | Paracetamol |
| Paracetamol 1000 | PARA | 5 | D | Paracetamol |
| Aspirin | ASPR | 8 | E | Aspirin |
方法二:自动用组内最常见的Code统一
如果不想手动写映射,可让系统自动把同一药品的Code统一为该组出现次数最多的Code:
# 统计每个基础名称对应的最高频Code most_common_code = df.groupby('Base_Name')['Code'].agg(lambda x: x.value_counts().idxmax()) # 替换Code列 df['Code'] = df['Base_Name'].map(most_common_code)
方法三:用组内第一个出现的Code统一
直接用每个药品组里第一个出现的Code作为统一值:
# 获取每个基础名称组的第一个Code first_code = df.groupby('Base_Name')['Code'].first() # 替换Code列 df['Code'] = df['Base_Name'].map(first_code)
内容的提问来源于stack exchange,提问作者python learner
相关产品推荐
相关产品推荐

