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...]
Это хорошо работает.
Может кто-нибудь объяснить немного об этом?
Спасибо.
Ответы
Ответ 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).
Надеюсь, это поможет вам.