ValueError: не удалось преобразовать строку в float: id - PullRequest
52 голосов
/ 07 декабря 2011

Я запускаю следующий скрипт Python:

#!/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]

Однако я получил такие ошибки, как:

ValueError: could not convert string to float: id

Я смущен этим.Когда я пытаюсь сделать это только для одной строки в интерактивном разделе, а не для цикла с использованием скрипта:

>>> 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...]

Я хорошо работаю.

Может кто-нибудь объяснить немного об этом?ТНХ

Ответы [ 6 ]

41 голосов
/ 07 декабря 2011

Очевидно, что некоторые из ваших строк не имеют допустимых данных с плавающей точкой, в частности, некоторые строки имеют текст id, который не может быть преобразован в число с плавающей точкой.

Когда вы пробуете это в интерактивном режиме, вы пробуете только первую строку, поэтому лучше всего напечатать строку, в которой вы получаете эту ошибку, и вы узнаете неправильную строку, например

#!/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]
17 голосов
/ 14 ноября 2015

Моя ошибка была очень простой: текстовый файл, содержащий данные, имел символ пробел (поэтому не виден) в последней строке.

Как вывод grep, у меня было 45 вместо 45.

11 голосов
/ 07 декабря 2011

Эта ошибка довольно многословна:

ValueError: could not convert string to float: id

Где-то в вашем текстовом файле строка содержит слово id, которое на самом деле не может быть преобразовано вчисло.

Ваш тестовый код работает, потому что слово id отсутствует в line 2.


Если вы хотите поймать эту строку, попробуйте этот код.Я немного почистил твой код:

#!/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]
5 голосов
/ 07 декабря 2011

Ваши данные могут быть не такими, как вы ожидаете - кажется, вы ожидаете, но не получаете, плавает.

Простым решением для выяснения, где это происходит, было бы добавить попытку / кроме цикла 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]
3 голосов
/ 02 марта 2018

Возможно, ваши цифры на самом деле не числа, а буквы, маскирующиеся под числа?

В моем случае используемый мной шрифт означал, что "l" и "1" выглядели очень похоже.У меня была строка, похожая на «1919», которую я считал «11919», и это все испортило.

0 голосов
/ 19 июня 2019

Проверьте номер в исходном файле csv, чтобы увидеть, есть ли двойные кавычки на числителях.

...