如何用Pandas将多单位比例值统一转换为g/ml格式?
Pandas实现单位转换解决方案
原始数据
import pandas as pd s = pd.Series(['3.95/kg', '3.30/kg', '3.49/kg', '3.96/g', '8.49/kg', '3.19/kg', '0.0154/g', '8.98/kg', '6.35/kg', '5.79/kg', '3.79/kg', '6.59/kg', '3.50/kg', '3.85/kg', '3.55/kg', '5.59/kg', '5.98/kg', '0.0152/g', '5.99/kg', '3.20/gr', '8.99/kg', '16.90/kg', '4.29/kg', '0.0128/g', '5.29/kg', '3.39/kg', '6.29/kg', '4.59/kg', '28.90/kg', '4.69/kg', '0.0389/gr', '0.0099/ml', '0.0608/g',])
转换规则
- 单位为
/kg:数值除以1000,单位改为/g - 单位为
/g或/gr:数值不变,统一单位为/g - 单位为
/ml:数值和单位保持不变 - 单位为
/l:数值除以1000,单位改为/ml
实现步骤及代码
方法1:向量化处理(高效推荐)
利用Pandas和Numpy的向量化操作,避免逐行遍历,提升处理效率:
import numpy as np # 拆分数值与单位为两列 df = s.str.split('/', expand=True) df.columns = ['value', 'unit'] df['value'] = df['value'].astype(float) # 计算新数值 df['new_value'] = np.where( df['unit'] == 'kg', df['value'] / 1000, np.where(df['unit'] == 'l', df['value'] / 1000, df['value']) ) # 确定新单位 df['new_unit'] = np.where( df['unit'] == 'kg', 'g', np.where(df['unit'].isin(['g', 'gr']), 'g', np.where(df['unit'] == 'l', 'ml', df['unit'])) ) # 合并数值与单位,保留对应精度 def format_result(row): if row['unit'] in ['kg', 'l']: return f"{row['new_value']:.5f}/{row['new_unit']}" else: return f"{row['new_value']}/{row['new_unit']}" result = df.apply(format_result, axis=1)
方法2:逐行处理(直观易读)
如果数据量不大,用apply逐行处理逻辑更直观:
# 拆分数值与单位 df = s.str.split('/', expand=True) df.columns = ['value', 'unit'] df['value'] = df['value'].astype(float) # 定义处理函数 def process_unit(row): value = row['value'] unit = row['unit'] if unit == 'kg': return f"{value/1000:.5f}/g" elif unit in ['g', 'gr']: return f"{value}/g" elif unit == 'ml': return f"{value}/ml" elif unit == 'l': return f"{value/1000:.4f}/ml" else: # 兼容未知单位,保持原格式 return f"{value}/{unit}" result = df.apply(process_unit, axis=1)
结果示例
处理后的结果前几项如下:
pd.Series(['0.00395/g','0.00330/g','0.00349/g','3.96/g','0.00849/g', ...])
内容的提问来源于stack exchange,提问作者INGl0R1AM0R1
相关产品推荐
相关产品推荐

