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

