ValueError: String konnte nicht in float: id konvertiert werden

75

Ich führe das folgende Python-Skript aus:

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

Ich habe jedoch folgende Fehler erhalten:

ValueError: could not convert string to float: id

Das verwirrt mich. Wenn ich dies nur für eine Zeile im interaktiven Abschnitt versuche, anstatt für eine Schleife mit einem Skript:

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

Es funktioniert gut.

Kann jemand ein wenig darüber erklären? Vielen Dank.

LookIntoEast
quelle

Antworten:

52

Offensichtlich haben einige Ihrer Zeilen keine gültigen Float-Daten, insbesondere einige Zeilen enthalten Text, idder nicht in Float konvertiert werden kann.

Wenn Sie es in einer interaktiven Eingabeaufforderung versuchen, versuchen Sie nur die erste Zeile. Am besten drucken Sie die Zeile, in der dieser Fehler auftritt, und Sie kennen die falsche Zeile, z

#!/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]
Anurag Uniyal
quelle
27

Mein Fehler war sehr einfach: Die Textdatei mit den Daten hatte in der letzten Zeile ein Leerzeichen (also nicht sichtbar).

Als Ausgabe von grep hatte ich 45 statt nur 45

Sopalajo de Arrierez
quelle
2
Leerzeichen und Tabulatoren sind sichtbar;) End-of-Linien und alikes nicht sind, beispielsweise Zeichen \n, \r.
Oleg Melnikov
Ich denke, dies ist der Zeitpunkt, an dem die meisten Leute herausfinden, dass Lib / re.py und .replace ('', '') existieren.
Ole Aldric
16

Dieser Fehler ist ziemlich ausführlich:

ValueError: could not convert string to float: id

Irgendwo in Ihrer Textdatei enthält eine Zeile das Wort id, das nicht wirklich in eine Zahl umgewandelt werden kann.

Ihr Testcode funktioniert, weil das Wort idin nicht vorhanden ist line 2.


Wenn Sie diese Zeile abfangen möchten, versuchen Sie diesen Code. Ich habe Ihren Code ein bisschen aufgeräumt:

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

Vielleicht sind Ihre Zahlen eigentlich keine Zahlen, sondern Buchstaben, die sich als Zahlen tarnen?

In meinem Fall bedeutete die von mir verwendete Schriftart, dass "l" und "1" sehr ähnlich aussahen. Ich hatte eine Saite wie 'l1919', die ich für '11919' hielt, und das hat die Dinge durcheinander gebracht.

Tom Roth
quelle
5

Ihre Daten entsprechen möglicherweise nicht Ihren Erwartungen - es scheint, dass Sie Floats erwarten, aber nicht erhalten.

Eine einfache Lösung, um herauszufinden, wo dies auftritt, besteht darin, der for-Schleife einen try / exception hinzuzufügen:

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]
Matt Fenwick
quelle
0

Überprüfen Sie die Nummer in der ursprünglichen CSV-Datei, um festzustellen, ob die Nummern ein doppeltes Anführungszeichen enthalten.

Haohan Li
quelle
2
Dies ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholungen können Sie Kommentare posten . Im Moment habe ich den Kommentar für Sie hinzugefügt und ich markiere diesen Beitrag zum Löschen.
Anton Menshov
0

Ich habe die ähnliche Situation mit der Basistechnik unter Verwendung von Pandas gelöst. Laden Sie zuerst die CSV- oder Textdatei mit pandas. Es ist ziemlich einfach

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

Stellen Sie dann den Datenindex auf die respektierte Spalte ein, die geändert werden muss. Wenn Ihre Daten beispielsweise eine ID als ein Attribut oder eine Spalte haben, setzen Sie den Index auf ID.

 data = data.set_index("ID")

Löschen Sie dann alle Zeilen mit "id" als Wert anstelle der Zahl mit dem folgenden Befehl.

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

Hoffe, das wird dir helfen.

Kapilfreeman
quelle