如何在Python的DataFrame中高效拆分测量值与单位至对应列?
解决DataFrame中数值与单位拆分并填充单位列的高效方法
场景复现
先构造符合你描述的示例DataFrame:
import pandas as pd data = { "item": ["身高", "身高", "体重"], "value": [175, "1.8m", "65kg"], "unit": ["cm", "", ""] } df = pd.DataFrame(data)
原DataFrame状态:
item value unit 0 身高 175 cm 1 身高 1.8m 2 体重 65kg
我们需要将带单位的value拆分,把数值保留在value列,单位移到unit列,最终得到:
item value unit 0 身高 175.0 cm 1 身高 1.8 m 2 体重 65.0 kg
高效实现方案
核心用正则表达式配合pandas向量化字符串操作,避免逐行循环,保证大数据量下的处理效率:
- 定义正则匹配模式
匹配开头的数值(支持整数、小数)和结尾的字母单位:
# 正则模式:捕获数值部分和单位部分 pattern = r'^(\d+\.?\d*)([a-zA-Z]+)$'
^(\d+\.?\d*):匹配开头的整数或小数(如175、1.8、65)([a-zA-Z]+)$:匹配结尾的字母单位(如cm、m、kg)
- 拆分带单位的行
用str.extract批量拆分value列,生成临时的数值和单位列:
# 将value转为字符串后提取,避免数值类型报错 split_cols = df["value"].astype(str).str.extract(pattern, expand=True) split_cols.columns = ["extracted_value", "extracted_unit"]
- 填充原DataFrame的列
- 对
value列:原数值保留,带单位的行替换为提取的数值 - 对
unit列:原单位保留,空值行填充提取的单位
# 填充value列,统一转为数值类型 df["value"] = pd.to_numeric(df["value"], errors="coerce").fillna( pd.to_numeric(split_cols["extracted_value"]) ) # 填充unit列,空值替换为提取的单位 df["unit"] = df["unit"].mask(df["unit"] == "", split_cols["extracted_unit"])
- 统一数据类型(可选)
确保value为数值型:
df["value"] = df["value"].astype(float)
扩展说明
- 如果需要支持负数测量值,可将正则模式改为
^(-?\d+\.?\d*)([a-zA-Z]+)$ - 所有操作都是pandas向量化实现,内部基于C优化,比Python循环效率高10~100倍,适合百万级以上数据量
内容的提问来源于stack exchange,提问作者Luckyboy. Jupiterchen
相关产品推荐
相关产品推荐

