Подтвердить что ты не робот

ValueError: не удалось преобразовать строку в float: id

Я использую следующий скрипт на 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...]

Это хорошо работает.

Может кто-нибудь объяснить немного об этом? Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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]

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

Я решил похожую ситуацию с базовой техникой, используя панд. Сначала загрузите csv или текстовый файл, используя pandas. Это довольно просто

data=pd.read_excel('link to the file')

Затем установите индекс данных для соответствующего столбца, который необходимо изменить. Например, если ваши данные имеют идентификатор в качестве одного атрибута или столбца, установите для индекса значение ID.

 data = data.set_index("ID")

Затем удалите все строки с "id" в качестве значения вместо числа, используя следующую команду.

  data = data.drop("id", axis=0). 

Надеюсь, это поможет вам.