web-dev-qa-db-ja.com

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

私はこれに混乱しています。スクリプトを使用したforループの代わりに、インタラクティブセクションの1行だけでこれを試してみると:

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

うまくいきました。

誰でもこれについて少し説明できますか? THX

52
LookIntoEast

明らかに、一部の行には有効な浮動小数点データがありません。具体的には、一部の行には浮動小数点に変換できないテキスト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]
41
Anurag Uniyal

私のエラーは非常に簡単でした。データを含むテキストファイルの最後の行にスペース(見えない)文字がありました。

Grepの出力として、45 の代わりに45がありました。

16

このエラーはかなり冗長です。

ValueError: could not convert string to float: id

Somewhereテキストファイルでは、行に__ idという単語が含まれていますが、実際には数値に変換できません。

Word idline 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]
11
Blender

あなたのデータはあなたが期待するものではないかもしれません-あなたは期待しているようですが、フロートを取得していません。

これが発生する場所を特定するための簡単な解決策は、forループにtry/exceptを追加することです。

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
Matt Fenwick

おそらくあなたの数字は実際には数字ではなく、数字を装った文字でしょうか?

私の場合、私が使用していたフォントは、「l」と「1」が非常に似ていることを意味していました。 「11919」だと思っていた「l1919」のような文字列があり、それはめちゃくちゃになりました。

3
Tom Roth