web-dev-qa-db-fra.com

Python: Convertit une chaîne (en notation scientifique) en float

J'essaie d'importer un fichier .csv volumineux contenant du texte et des nombres à l'aide de genfromtxt dans numpy. Je ne m'intéresse qu'à deux colonnes. J'ai la plupart des importations triées avec:

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)

Avec une sortie pour elem et concs respectivement:

['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']

J'ai essayé beaucoup de choses différentes pour convertir la chaîne concs en float, mais cela ne semble pas plaire au fait que les concs soient en notation scientifique ... existe-t-il un moyen de transformer les valeurs de concs en float? Merci d'avance pour ton soutien.

15
Dr. Toboggan

La fonction float peut faire ceci:

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

ou pour une liste:

>>> map(float, ['3.76E+00', '1.31E+01', '1.14E+01'])
[3.76, 13.1, 11.4]
17
RichieHindle
 with open( datafile,'r' ) as inData:
     for line in inData:
          j = list( map( float,   filter( None  , [ x for x in line.strip().split(',') ] )) )

Je viens de mentionner en général, car cela résout un problème similaire qui m'a amené à cette page.

0
mist42nz

Cela pourrait être utile pour tout le monde. J’avais un problème similaire et j’ai trouvé sur stackoverflow l’application de pandas to_numeric aux colonnes DataFrame, notamment le remplacement des virgules par des points

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