替换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
相关产品推荐
相关产品推荐

