web-dev-qa-db-fra.com

ValueError: impossible de convertir la chaîne en float: id

J'exécute le script python suivant:

#!/usr/bin/python

import os,sys
from scipy import stats
import numpy as np

f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
    w=f[i].split()
    l1=w[1:8]
    l2=w[8:15]
    list1=[float(x) for x in l1]
    list2=[float(x) for x in l2]
    result=stats.ttest_ind(list1,list2)
    print result[1]

Cependant, j'ai eu les erreurs comme:

ValueError: could not convert string to float: id

Je suis confus par ceci. Quand j'essaye cela pour seulement une ligne dans la section interactive, au lieu d'une boucle avec script:

>>> from scipy import stats
>>> import numpy as np
>>> f=open('data2.txt','r').readlines()
>>> w=f[1].split()
>>> l1=w[1:8]
>>> l2=w[8:15]
>>> list1=[float(x) for x in l1]
>>> list1
[5.3209183842, 4.6422726719, 4.3788135547, 5.9299061614, 5.9331108706, 5.0287087832, 4.57...]

Je fonctionne bien.

Quelqu'un peut-il expliquer un peu à ce sujet? Merci

55
LookIntoEast

Il est évident que certaines de vos lignes n'ont pas de données float valides, en particulier certaines lignes ont un texte id qui ne peut pas être converti en float.

Lorsque vous l’essayez dans l’Invite interactif, vous n’essayez que la première ligne. Le meilleur moyen est donc d’imprimer la ligne où vous obtenez cette erreur et vous saurez que la mauvaise ligne, par exemple.

#!/usr/bin/python

import os,sys
from scipy import stats
import numpy as np

f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
    w=f[i].split()
    l1=w[1:8]
    l2=w[8:15]
    try:
        list1=[float(x) for x in l1]
        list2=[float(x) for x in l2]
    except ValueError,e:
        print "error",e,"on line",i
    result=stats.ttest_ind(list1,list2)
    print result[1]
41
Anurag Uniyal

Mon erreur était très simple: le fichier texte contenant les données avait un caractère espace (donc non visible) sur la dernière ligne.

En tant que résultat de grep, j'avais 45  au lieu de 45.

17

Cette erreur est assez verbeuse:

ValueError: could not convert string to float: id

Quelque part dans votre fichier texte, une ligne contient le mot id qui ne peut pas être converti en nombre.

Votre code de test fonctionne car le mot id n'est pas présent dans line 2.


Si vous voulez attraper cette ligne, essayez ce code. J'ai nettoyé votre code un peu:

#!/usr/bin/python

import os, sys
from scipy import stats
import numpy as np

for index, line in enumerate(open('data2.txt', 'r').readlines()):
    w = line.split(' ')
    l1 = w[1:8]
    l2 = w[8:15]

    try:
        list1 = map(float, l1)
        list2 = map(float, l2)
    except ValueError:
        print 'Line {i} is corrupt!'.format(i = index)'
        break

    result = stats.ttest_ind(list1, list2)
    print result[1]
11
Blender

Vos données ne correspondent peut-être pas à vos attentes - il semble que vous attendiez, mais que vous n'obteniez pas, qu'elles flottent.

Une solution simple pour savoir où cela se produit serait d'ajouter un try/except à la boucle for:

for i in range(0,N):
    w=f[i].split()
    l1=w[1:8]
    l2=w[8:15]
    try:
      list1=[float(x) for x in l1]
      list2=[float(x) for x in l2]
    except ValueError, e:
      # report the error in some way that is helpful -- maybe print out i
    result=stats.ttest_ind(list1,list2)
    print result[1]
5
Matt Fenwick

Peut-être que vos chiffres ne sont pas vraiment des chiffres, mais des lettres se faisant passer pour des chiffres?

Dans mon cas, la police que j'utilisais signifiait que "l" et "1" étaient très similaires. J'avais une chaîne comme 'l1919' que je pensais être '11919' et qui a tout gâché.

4
Tom Roth

Vérifiez le numéro dans le fichier csv d'origine pour voir s'il y a des guillemets doubles sur les numéros.

0
Haohan Li