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

替换Pandas DataFrame中科学计数法的'D'为'E'的方法

嘿,我懂你碰到的这个问题了——你写的循环里改的只是临时变量,根本没动到DataFrame里的实际数据,这可是Pandas新手常踩的坑之一!

先给你说清楚为啥原来的代码不行:当你写for i in dedx[c]的时候,i只是从列里取出来的元素副本,你给i重新赋值,只是改变了这个临时变量的指向,完全没把修改后的值写回原DataFrame。

下面给你几个高效的解决方案,比循环靠谱多了:

方法1:全局向量化替换(适合整个DataFrame处理)

直接把所有元素转成字符串,替换D为E,再转回浮点型,一行代码搞定:

dedx = dedx.astype(str).replace('D', 'E', regex=False).astype(float)

这个方法利用Pandas的向量化操作,比循环快N倍,尤其适合数据量大的情况。如果你的DataFrame里有本来就是数值类型的列(比如示例里的ENERGY(MEV)),转字符串再转回浮点型也不会有问题。

方法2:针对元素逐个处理(适合混合类型的DataFrame)

如果你的DataFrame里既有字符串格式的科学计数法,又有普通数值,用applymap可以精准处理每个元素:

dedx = dedx.applymap(lambda x: float(str(x).replace('D', 'E')) if isinstance(x, str) else x)

这个lambda函数会检查每个元素:如果是字符串就替换D为E再转浮点,否则保持原数值不变。

方法3:读取CSV时直接处理(最优解)

其实最好的办法是在读取文件的时候就把D换成E,省得之后再折腾:

import pandas as pd

# 定义转换函数
def convert_d_notation(val):
    str_val = str(val)
    if 'D' in str_val:
        return float(str_val.replace('D', 'E'))
    return float(str_val)

# 读取时指定需要转换的列
dedx = pd.read_csv('your_data.csv', converters={
    'DE/DX(MEV/MM)': convert_d_notation,
    'DE/DX(MEV.CM2/MG)': convert_d_notation
    # 把所有带D格式的列都列在这里
})

这样读取出来的DataFrame直接就是浮点型数据,一步到位,效率最高。

如果你非要用循环(不推荐)

要是你就是想试试循环怎么写对,那得用索引来定位赋值,不能直接遍历元素:

for c in dedx.columns:
    for idx in dedx.index:
        val = dedx.loc[idx, c]
        if isinstance(val, str):
            dedx.loc[idx, c] = float(val.replace('D', 'E'))

不过这种方法效率极低,数据量大的时候会慢到离谱,所以还是优先用前面的向量化方法哈。

内容的提问来源于stack exchange,提问作者Allentro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:23:40