ValueError: не вдалося перетворити рядок у float: id


76

Я запускаю такий сценарій 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...]

Це добре працює.

Хтось може пояснити трохи про це? Дякую.

Відповіді:


53

Очевидно, що деякі з ваших рядків не мають дійсних плаваючих даних, зокрема деякі рядки містять текст, 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]

28

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

Як вихід grep я мав 45 замість просто 45


2
Прогалини і вкладки видно;) Заключна ліній і двійники не є, наприклад, символи \n, \r.
Олег Мельников

Я думаю, це момент часу, коли більшість людей з’ясовує, що Lib / re.py та .replace ('', '') існують.
Оле Олдрік,

17

Ця помилка досить багатослівна:

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]

7

Можливо, ваші цифри насправді не цифри, а букви, що видаються під цифри?

У моєму випадку шрифт, який я використовував, означав, що "l" та "1" виглядали дуже схожими. У мене був рядок на кшталт 'l1919', який, на мою думку, був '11919', і це заплутало речі.


5

Ваші дані можуть бути не такими, як ви очікуєте - здається, ви очікуєте, але не отримуєте, плаваючі.

Простим рішенням, щоб з’ясувати, де це відбувається, було б додати спробу / крім циклу 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]

0

Перевірте номер у вихідному файлі CSV, щоб перевірити, чи є на номерах подвійні лапки.


2
Це справді коментар, а не відповідь. Трохи більше представників ви зможете залишати коментарі . На даний момент я додав для вас коментар і позначаю це повідомлення для видалення.
Антон

0

Подібну ситуацію я вирішив базовою технікою за допомогою панд. Спочатку завантажте CSV або текстовий файл за допомогою панд. Це досить просто

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

Потім встановіть індекс даних у поважний стовпець, який потрібно змінити. Наприклад, якщо ваші дані мають ідентифікатор як один атрибут або стовпець, встановіть індекс на ідентифікатор.

 data = data.set_index("ID")

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

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

Сподіваюся, це вам допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.