web-dev-qa-db-ja.com

インポートされた.csvで文字列をFloatに変更する

すぐに解決できなかった問題の簡単な質問:

私は.csvファイルで作業していますが、文字列を浮動小数点数に変換する簡単な方法が見つからないようです。これが私のコードです、

_import csv

def readLines():
    with open('testdata.csv', 'rU') as data:
        reader = csv.reader(data)
        row = list(reader)
        for x in row:
            for y in x:
                print type(float(y)),
readLines()
_

ご覧のとおり、現在は変数行のリストのxセット内のすべてのy要素のタイプを出力します。これにより、_"<type 'float'>"_の長いリストが生成されます。しかし、これは実際には各要素を浮動小数点数に変更することも、forループを設定してfloat(y)(型テストが各要素に対して 'string'を返す)を実行することも機能しません。

私はliteral_evalも試しましたが、それも失敗しました。リスト要素をフロートに変更する唯一の方法は、リストを理解するか手動で新しいリストを作成することですが、各リストの元のフォーマットが失われます(1つの大きなリスト内の一連の要素のリストとして)。

全体的な質問は、「Pythonを使用して.csvまたはExcel形式でデータを読み取り、整理、および合成する最も簡単な方法は何ですか?」

礼儀正しく/知識が豊富で助けてくれる人に前もって感謝します。

16
userNaN

あなたは、Pythonの組み込みcsvモジュールが混合データ型の処理において非常に原始的であり、インポート時にすべての型変換を行うこと、そしてそれでもオプションの非常に制限的なメニューがあることは正しいです、ほとんどの現実世界のデータセットを壊します(ブール値と因子の不整合な引用とエスケープ、欠落または不完全な値、フィールド内の幻の引用またはエスケープ文字の原因となるUnicodeエンコードの不一致、不完全な行は例外の原因となります)。 csvインポートの修正は pandasの無数の利点の1つです。したがって、最終的な答えは、組み込みのcsvインポートの使用を停止し、パンダの使用を開始することです。しかし、あなたの質問に対する文字通りの答えから始めましょう。

最初に「csvインポートで文字列を浮動小数点数に変換する方法」を尋ねました。その答えは csv doc に従ってcsv.reader(..., quoting=csv.QUOTE_NONNUMERIC)を開くことです

csv.QUOTE_NONNUMERIC:引用符で囲まれていないすべてのフィールドをfloat型に変換するようにリーダーに指示します。

引用符で囲まれていないすべてのフィールド(整数、浮動小数点数、テキスト、ブール値など)を浮動小数点数に変換しても問題ない場合、これは機能します。これは通常、多くの理由で悪い考えです(ブール値または係数のNA値がないか、サイレントにスケルチされます)。 。さらに、引用符で囲まれていないテキストフィールドでは明らかに失敗します(例外がスローされます)。したがって、脆弱であり、_try..catch_で保護する必要があります。

それからあなたは尋ねました: '私は全体的な質問は本当に単に「Pythonを使用して.csvまたはExcel形式でデータを読み取り、整理し、合成する最も簡単な方法は何だと思います? "'への無意味なcsv.readerソリューションがcsv.reader(..., quoting=csv.QUOTE_NONNUMERIC)で開く

しかし、@ geoffspearが正しく応答したので「あなたの「全体的な質問」に対する答えは「パンダ」かもしれませんが、少しあいまいです。」

15
smci

一連の文字列を浮動小数点数に変換する場合、 try/except を使用してエラーをキャッチする必要があります。

def conv(s):
    try:
        s=float(s)
    except ValueError:
        pass    
    return s

print [conv(s) for s in ['1.1','bls','1','nan', 'not a float']] 
# [1.1, 'bls', 1.0, nan, 'not a float']

変換できない文字列は変更されずにそのまま渡されることに注意してください。

CsvファイルISテキストファイルなので、同様の機能を使用する必要があります。

def readLines():
    def conv(s):
        try:
            s=float(s)
        except ValueError:
            pass    
        return s

    with open('testdata.csv', 'rU') as data:
        reader = csv.reader(data)
        for row in reader:
            for cell in row:
                y=conv(cell)
              # do what ever with the single float
         # OR
         # yield [conv(cell) for cell in row]  if you want to write a generator...    
4
dawg

次のようなものを試してください

import csv

def read_lines():
    with open('testdata.csv', 'rU') as data:
        reader = csv.reader(data)
        for row in reader:
            yield [ float(i) for i in row ]

for i in read_lines():
    print(i)

# to get a list, instead of a generator, use
xy = list(read_lines())

最も簡単な方法については、xlrdxlwtモジュールを参照することをお勧めします。個人的には、さまざまなCSV形式すべてに常に苦労しています。

3
Antti Haapala
for y in x:
                print type(float(y)),

float(y)はyの値を取り、それに基づいてfloatを返します。 yは変更されません。新しいオブジェクトを返します。

y = float(y)

あなたが探しているものに似ています-オブジェクトを修正する必要があります。

0
Paul Becotte