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

Pandas DataFrame多单位重量转换及无效数据处理求助

处理Pandas重量列的单位转换与数据清洗

解决方案

通过正则提取有效数值、处理乘积格式、统一单位转换三个步骤完成需求,同时清理无效数据:

1. 定义单位转换系数

先整理各单位到千克(KG)的转换系数,其中ml默认按1g/ml的密度转换(可按需调整):

unit_conversion = {
    'kg': 1.0,
    'g': 0.001,
    'oz': 0.0283495,
    'ml': 0.001
}

2. 编写重量转换函数

用正则匹配提取数值和单位,同时处理12 x 100g这类乘积格式:

import re
import pandas as pd

def convert_to_kg(weight_entry):
    # 处理空值或非字符串类型
    if pd.isna(weight_entry) or not isinstance(weight_entry, str):
        return None
    
    # 匹配乘积格式(如12x100g)
    product_match = re.match(r'(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)\s*([a-zA-Z]+)', weight_entry.strip(), re.IGNORECASE)
    if product_match:
        num1 = float(product_match.group(1))
        num2 = float(product_match.group(2))
        unit = product_match.group(3).lower()
        total_weight = num1 * num2
    else:
        # 匹配普通数值+单位格式(如500g、1.2oz)
        basic_match = re.match(r'(\d+(?:\.\d+)?)\s*([a-zA-Z]+)', weight_entry.strip(), re.IGNORECASE)
        if not basic_match:
            # 无法识别的无效条目,返回None
            return None
        total_weight = float(basic_match.group(1))
        unit = basic_match.group(2).lower()
    
    # 检查单位是否在转换列表中
    if unit not in unit_conversion:
        return None
    
    # 转换为KG并保留1位小数
    return round(total_weight * unit_conversion[unit], 1)

3. 应用到DataFrame并清理无效行

假设你的DataFrame名为df,重量列名为weight:

# 生成转换后的KG列
df['weight_kg'] = df['weight'].apply(convert_to_kg)

# 删除无效行(即转换后为None的行)
df = df.dropna(subset=['weight_kg'])

关键细节

  • 正则不区分单位大小写(KG、kg、G都能匹配)
  • 无效条目(如abc123、5xxg这类无法匹配的内容)会被标记为None,最终被删除
  • ml的转换系数基于水的密度(1g/ml),如果是其他液体,可修改unit_conversion中的对应值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:47:46