将科学计数法表示的字符串转换为浮点数

30

我正在尝试使用numpy中的genfromtxt导入一个包含文本和数字的大型.csv文件。我只对两列感兴趣。我已经使用以下代码解决了大部分导入问题:

def importfile(root):
    data = root.entry.get()
    atw = np.genfromtxt(data, delimiter=",",
                        skip_header=1,
                        skip_footer=2,
                        autostrip=True,
                        usecols=(25,26),
                        dtype=("|S10"))
    elem = atw[:,0]
    concs = atw[:,1]
        
    print(elem)
    print(concs)

在分别输出elemconcs的情况下:

['Na2O' 'MgO' 'Al2O3' 'SiO2' 'P2O5' 'SO3' 'Cl' 'K2O' 'CaO' 'TiO2' 'Cr2O3'
'MnO' 'FeO' 'NiO' 'Cu2O' 'ZnO' 'Ga2O3' 'SrO' 'Y2O3']

['3.76E+00' '1.31E+01' '1.14E+01' '4.04E+01' '1.24E+00' '5.89E-02'
'2.43E-02' '1.53E+00' '1.49E+01' '2.87E+00' '6.05E-02' '1.96E-01'
'1.17E+01' '3.69E-02' '8.73E-03' '1.39E-02' '1.93E-03' '1.88E-01'
'5.58E-03']

我尝试了很多不同的方法将字符串concs转换为浮点数,但它似乎不喜欢那些以科学计数法表示的浓度值...有没有一种方法可以将concs的值转换为浮点数?

4个回答

38

float函数可以实现这个功能:

>>> float('1.31E+01')
13.1

或者是列表:

>>> map(float, ['3.76E+00', '1.31E+01', '1.14E+01'])
[3.76, 13.1, 11.4]

3
强制使用列表推导式的方法:n = ['3.76E+00', '1.31E+01', '1.14E+01'] [float(i) for i in n] - Jason Sperske
1
float(i) 对我不起作用。我有一个混合列表,我想要转换它。如果我不想拆分它,我不确定应该使用什么。 - Reihan_amn

0
 with open( datafile,'r' ) as inData:
     for line in inData:
          j = list( map( float,   filter( None  , [ x for x in line.strip().split(',') ] )) )

一般来说,它解决了一个类似于我来到这个页面的问题。


0

也许这对任何人都有帮助,我遇到了类似的问题,并在stackoverflow上找到了关于将pandas to_numeric应用于包括逗号替换为点的DataFrame列的解决方法。

import re
import pandas as pd
atw[cc] = pd.to_numeric(atw[cc].apply(lambda x: re.sub(',', '.', str(x))))

-3
有了这样的科学记数法列表,你还可以做到这一点:
1. a = [9.0181446e-01, 1.3179450e-02, 4.3021311e-04, 2.3546994e-03, 3.6531375e-03, 7.8567989e-02]
2. max(a)

输出结果为:0.90181446


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接