Python中如何将Str类型带M/K单位的列转换为数值格式
股票带单位成交量字段数值转换实现
这套实现完全适配你遇到的「数字+K/M类单位后缀」的成交量字符串格式,转换后的纯数值列可以直接作为特征输入Random Forest模型,不需要额外清洗。
核心规则说明
先对齐常见股票数据的单位倍率映射,和你提到的转换要求完全匹配:
- 后缀
K代表千,对应倍率1000 - 后缀
M代表百万,对应倍率1000000 - 额外兼容
B(十亿)后缀场景,适配不同数据源的标注差异
具体代码实现
小数据集通用实现
基于自定义函数逐行转换,逻辑直观容易排查问题,适合万行以内规模的数据集:
import pandas as pd import numpy as np # 定义单位倍率映射表 unit_scale = { 'K': 10**3, 'M': 10**6, 'B': 10**9 } def format_volume(volume_raw): # 兼容空值场景 if pd.isna(volume_raw): return np.nan # 清理字符串两端多余空格 volume_raw = str(volume_raw).strip() # 拆分单位和数值部分:最后一位是单位,前面的内容是带小数的原始数值 unit = volume_raw[-1].upper() num_part = float(volume_raw[:-1]) # 计算转换后的整数值 return int(num_part * unit_scale[unit]) # 假设原始数据集为pandas DataFrame,原始成交量列名为"Volume" df["Volume_numeric"] = df["Volume"].apply(format_volume)
大规模数据集高效实现
向量化操作替代逐行循环,在十万行以上数据集上的运行效率比apply版本高20-50倍,适合长周期股票回测的海量数据场景:
# 拆分提取字符串中的单位部分 df["temp_unit"] = df["Volume"].str[-1].str.upper() # 拆分提取字符串中的数值部分 df["temp_value"] = df["Volume"].str[:-1].astype(float) # 映射对应计算倍率 unit_multiplier = df["temp_unit"].map(unit_scale) # 计算最终数值型成交量 df["Volume_numeric"] = (df["temp_value"] * unit_multiplier).astype(int) # 清理临时中间列 df.drop(columns=["temp_unit", "temp_value"], inplace=True)
结果校验
可以随机抽取几行对比转换前后的结果,确认匹配你要求的映射规则:
原始值
23.9M→ 转换结果为23900000
原始值24K→ 转换结果为24000
原始值67M→ 转换结果为67000000
异常场景兼容
如果遇到不带单位的纯数值字符串格式的记录,可以在转换逻辑中加判断:若字符串最后一位是数字,就直接转换为数值返回,避免触发单位匹配报错。
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

