如何用Pandas将科学计数法拆分为有效数与指数两列?
解决方案
针对百万行级别的DataFrame,我们可以用向量化数值计算+字符串处理的组合方案,完全规避逐行apply,保证处理效率:
步骤说明
- 计算原始市值的10进制指数(即科学计数法的指数部分)
- 提取科学计数法的系数(范围锁定在[1,10)之间)
- 将系数转换为字符串,去掉小数点和末尾零,得到无尾零的有效数字整数
- 根据有效数字的位数调整指数,得到最终的
EXP列
代码实现
import pandas as pd import numpy as np # 示例数据 data = {'MARKET_VALUE': [6.898806e+09, 6.898806e+05, 6.898806e+03]} df = pd.DataFrame(data) # 1. 计算原始10进制指数 df['exp10'] = np.floor(np.log10(df['MARKET_VALUE'])).astype(int) # 2. 提取科学计数法系数([1,10)区间) df['coeff'] = df['MARKET_VALUE'] / (10 ** df['exp10']) # 3. 向量化转换系数为字符串,处理得到无尾零的有效数字 # 用numpy向量化格式化,避免apply format_coeff = np.vectorize(lambda x: "{:.15f}".format(x)) df['coeff_str'] = format_coeff(df['coeff']) # 去掉小数点和末尾零,转换为整数 df['SIGNIFICAND'] = df['coeff_str'].str.replace('.', '', regex=False)\ .str.rstrip('0')\ .astype(int) # 4. 计算最终EXP列:原始指数 - (有效数字位数 - 1) df['EXP'] = df['exp10'] - (df['SIGNIFICAND'].astype(str).str.len() - 1) # 保留需要的列 result = df[['MARKET_VALUE', 'SIGNIFICAND', 'EXP']] print(result)
输出结果
MARKET_VALUE SIGNIFICAND EXP 0 6.898806e+09 6898806 3 1 6.898806e+05 6898806 -1 2 6.898806e+03 6898806 -3
性能优化说明
- 全程使用numpy/pandas的向量化操作,仅在格式化系数时用了
np.vectorize,其内部实现比Python级别的apply更高效,适配百万行数据规模 - 字符串处理部分用了pandas的
str向量化方法,彻底规避逐行循环 - 如果你的数据中小数位数固定(比如示例中的6位),可以直接用
"{:.6f}".format(x)代替15f,进一步提升处理速度
内容的提问来源于stack exchange,提问作者Richard B
相关产品推荐
相关产品推荐

