ValueError: kon string niet converteren naar float: id

Ik gebruik het volgende python-script:

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

Ik kreeg echter de fouten zoals:

ValueError: could not convert string to float: id

Ik ben hierdoor in de war.
Als ik dit probeer voor slechts één regel in de interactieve sectie, in plaats van voor een lus met script:

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

Het werkt goed.

Kan iemand hier iets over uitleggen?
Dank je.


Antwoord 1, autoriteit 100%

Het is duidelijk dat sommige van uw regels geen geldige float-gegevens hebben, met name sommige regels hebben tekst iddie niet naar float kan worden geconverteerd.

Wanneer u het probeert in de interactieve prompt, probeert u alleen de eerste regel, dus de beste manier is om de regel af te drukken waar u deze fout krijgt en u weet dan de verkeerde regel, bijvoorbeeld

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

Antwoord 2, autoriteit 45%

Mijn fout was heel eenvoudig: het tekstbestand met de gegevens had een spatie(dus niet zichtbaar) teken op de laatste regel.

Als uitvoer van grep had ik 45 in plaats van alleen 45


Antwoord 3, autoriteit 29%

Deze fout is behoorlijk uitgebreid:

ValueError: could not convert string to float: id

Ergensin uw tekstbestand staat in een regel het woord id, dat niet echt in een getal kan worden omgezet.

Uw testcode werkt omdat het woord idniet voorkomt in line 2.


Als je die regel wilt pakken, probeer dan deze code. Ik heb je code een beetje opgeschoond:

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

Antwoord 4, autoriteit 11%

Misschien zijn uw cijfers eigenlijk geen cijfers, maar letters die zich voordoen als cijfers?

In mijn geval betekende het lettertype dat ik gebruikte dat “l” en “1” erg op elkaar leken. Ik had een string als ‘l1919’ waarvan ik dacht dat het ‘11919’ was en dat maakte de boel in de war.


Antwoord 5, autoriteit 8%

Je gegevens zijn misschien niet wat je verwacht — het lijkt erop dat je verwacht, maar niet krijgt, zweeft.

Een eenvoudige oplossing om erachter te komen waar dit gebeurt, is door een try/behalve toe te voegen aan de for-loop:

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]

Antwoord 6, autoriteit 6%

Voor een Pandas-dataframe met een kolom met getallen met komma’s, gebruik dit:

df["Numbers"] = [float(str(i).replace(",", "")) for i in df["Numbers"]]

Dus waarden zoals 4,200.42worden geconverteerd naar 4200.42als een float.

Bonus 1: Dit is snel.

Bonus 2: Meer ruimtebesparend als dat dataframe wordt opgeslagen in iets als Apache Parketformaat.


Antwoord 7, autoriteit 3%

Kortste weg:

df["id"] = df['id'].str.replace(',', '').astype(float)– als ‘,’ het probleem is

df["id"] = df['id'].str.replace(' ', '').astype(float)– als lege ruimte het probleem is


Antwoord 8

Ik heb de vergelijkbare situatie opgelost met basistechniek met behulp van panda’s. Laad eerst het csv- of tekstbestand met panda’s. Het is vrij eenvoudig

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

Stel vervolgens de index van gegevens in op de gerespecteerde kolom die moet worden gewijzigd. Als uw gegevens bijvoorbeeld ID als één attribuut of kolom hebben, stelt u vervolgens index in op ID.

data = data.set_index("ID")

Verwijder vervolgens alle rijen met “ID” als de waarde in plaats van een nummer met behulp van de volgende opdracht.

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

Hoop, dit zal u helpen.

Other episodes