You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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向量化字符串操作,避免逐行循环,保证大数据量下的处理效率:

  1. 定义正则匹配模式
    匹配开头的数值(支持整数、小数)和结尾的字母单位:
# 正则模式:捕获数值部分和单位部分
pattern = r'^(\d+\.?\d*)([a-zA-Z]+)$'
  • ^(\d+\.?\d*):匹配开头的整数或小数(如175、1.8、65)
  • ([a-zA-Z]+)$:匹配结尾的字母单位(如cm、m、kg)
  1. 拆分带单位的行
    用str.extract批量拆分value列,生成临时的数值和单位列:
# 将value转为字符串后提取,避免数值类型报错
split_cols = df["value"].astype(str).str.extract(pattern, expand=True)
split_cols.columns = ["extracted_value", "extracted_unit"]
  1. 填充原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"])
  1. 统一数据类型(可选)
    确保value为数值型:
df["value"] = df["value"].astype(float)

扩展说明

  • 如果需要支持负数测量值,可将正则模式改为^(-?\d+\.?\d*)([a-zA-Z]+)$
  • 所有操作都是pandas向量化实现,内部基于C优化,比Python循环效率高10~100倍,适合百万级以上数据量

内容的提问来源于stack exchange,提问作者Luckyboy. Jupiterchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:30:47