You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas将科学计数法拆分为有效数与指数两列?

解决方案

针对百万行级别的DataFrame,我们可以用向量化数值计算+字符串处理的组合方案,完全规避逐行apply,保证处理效率:

步骤说明

  1. 计算原始市值的10进制指数(即科学计数法的指数部分)
  2. 提取科学计数法的系数(范围锁定在[1,10)之间)
  3. 将系数转换为字符串,去掉小数点和末尾零,得到无尾零的有效数字整数
  4. 根据有效数字的位数调整指数,得到最终的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:00:51