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
相关产品推荐
相关产品推荐

