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

如何将Pandas DataFrame中不同单位的字符串转换为同单位浮点数?

处理Pandas DataFrame中带不同单位的字符串转统一单位浮点数

要解决这类单位不统一的字符串转浮点数问题,核心是拆分数值与单位,再按照预设规则做单位转换。下面用具体代码示例演示:

1. 构造示例数据

先模拟一个包含不同单位的DataFrame:

import pandas as pd

df = pd.DataFrame({
    "长度": ["12.3 mm", "4.56 cm", "78 mm", "0.9 cm", "15"],  # 无单位默认按mm处理
    "重量": ["500 g", "1.2 kg", "340 g", "0.85 kg", "200"]   # 无单位默认按g处理
})

2. 编写单位转换函数

针对每一列的单位规则,写专用转换函数,用正则表达式提取数值和单位:

长度列转统一mm单位

def convert_length_to_mm(value):
    import re
    # 匹配数值(整数/小数)和可选单位,兼容无空格的情况(如"4.56cm")
    match = re.match(r'(\d+\.?\d*)\s*([a-zA-Z]+)?', str(value))
    if not match:
        return pd.NA  # 无法识别的内容返回缺失值
    
    num = float(match.group(1))
    # 单位转小写,避免大小写差异(如"CM"/"Kg")
    unit = match.group(2).lower() if match.group(2) else 'mm'
    
    # 单位转换逻辑
    if unit == 'cm':
        return num * 10
    elif unit == 'mm':
        return num
    else:
        return pd.NA  # 未知单位返回缺失值

# 应用到原DataFrame,生成新列
df['长度(mm)'] = df['长度'].apply(convert_length_to_mm)

重量列转统一g单位

def convert_weight_to_g(value):
    import re
    match = re.match(r'(\d+\.?\d*)\s*([a-zA-Z]+)?', str(value))
    if not match:
        return pd.NA
    
    num = float(match.group(1))
    unit = match.group(2).lower() if match.group(2) else 'g'
    
    if unit == 'kg':
        return num * 1000
    elif unit == 'g':
        return num
    else:
        return pd.NA

df['重量(g)'] = df['重量'].apply(convert_weight_to_g)

3. 查看处理结果

运行后打印df,得到转换后的数值列:

print(df)

输出示例:

重量      长度  长度(mm)  重量(g)
0   500 g  12.3 mm    12.3   500.0
1  1.2 kg  4.56 cm    45.6  1200.0
2   340 g    78 mm    78.0   340.0
3  0.85 kg   0.9 cm     9.0   850.0
4     200       15    15.0   200.0

额外注意事项

  • 正则表达式可以根据实际数据调整,比如支持负数、科学计数法(如1.2e3 kg)
  • 若有更多单位(如m转mm、mg转g),只需在转换逻辑里添加对应的乘数
  • 对于无法识别的单位或非数值内容,返回pd.NA便于后续用df.dropna()或df.fillna()处理

内容的提问来源于stack exchange,提问作者Joseph Summerhays

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:11:20