如何从DataFrame测量值中分离含字符、符号和数字的复杂计量单位?
分离DataFrame中复杂测量值与计量单位的方案
问题场景
现有如下格式的DataFrame,其中value列包含数值与复杂计量单位的组合(比如带面积符号、分数形式、科学计数相关的单位),需要将数值与单位分离到对应的value和unit列:
| measurements | value | unit |
|---|---|---|
| mea1 | 12.8875cm2 | |
| mea2 | 33.1 mL/min/1.73m2 | |
| mea3 | 2.53mg / dL | |
| mea4 | 0.005ml/ min / m2 | |
| mea5 | 0.8ml/m2 | |
| mea6 | 0.73x10^3/UL |
期望输出
处理后得到如下结果,数值部分提取到value列,单位部分清理多余空格后存入unit列:
| measurements | value | unit |
|---|---|---|
| mea1 | 12.8875 | cm2 |
| mea2 | 33.1 | mL/min/1.73m2 |
| mea3 | 2.53 | mg/dL |
| mea4 | 0.005 | ml/min/m2 |
| mea5 | 0.8 | ml/m2 |
| mea6 | 0.73 | x10^3/UL |
实现方案
利用Python的pandas结合正则表达式可以快速实现需求,核心逻辑是提取字符串开头的数值部分,再清理单位中的多余空格:
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的数据源) data = { 'measurements': ['mea1', 'mea2', 'mea3', 'mea4', 'mea5', 'mea6'], 'value': ['12.8875cm2', '33.1 mL/min/1.73m2', '2.53mg / dL', '0.005ml/ min / m2', '0.8ml/m2', '0.73x10^3/UL'], 'unit': ['', '', '', '', '', ''] } df = pd.DataFrame(data) # 提取开头的数值(整数/小数)和剩余的单位部分 df[['extracted_value', 'raw_unit']] = df['value'].str.extract(r'^(\d+\.?\d*)\s*(.*)$') # 清理单位中的所有多余空格 df['unit'] = df['raw_unit'].str.replace(r'\s+', '', regex=True) # 更新value列为提取的数值,删除临时辅助列 df['value'] = df['extracted_value'] df = df.drop(['extracted_value', 'raw_unit'], axis=1) # 查看结果 print(df)
正则说明
正则表达式 ^(\d+\.?\d*)\s*(.*)$ 的作用:
^(\d+\.?\d*):匹配字符串开头的数值部分,支持整数(如33)和小数(如12.8875、0.005)\s*:匹配数值与单位之间的任意数量空格(.*)$:匹配剩余的所有内容作为原始单位
内容的提问来源于stack exchange,提问作者Luckyboy. Jupiterchen
相关产品推荐
相关产品推荐

