18

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

.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'>"ます。しかし、これは実際には各要素を float に変更するわけではなく、for ループを実行するように設定することもできませんfloat(y)(型テストは各要素に対して「文字列」を返します)。

私もliteral_evalを試しましたが、それも失敗しました。リスト要素を float に変更する唯一の方法は、リスト内包表記または手動で新しいリストを作成することですが、これにより、各リストの元の書式設定が失われます (1 つの大きなリスト内の一定量の要素のリストとして)。

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

助けてくれる礼儀正しい/知識のある人に前もって感謝します.

4

4 に答える 4

17

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

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

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

これは、引用符で囲まれていないすべてのフィールド (整数、浮動小数点数、テキスト、ブール値など) が浮動小数点数に変換されても問題ない場合に機能します。これは、多くの理由で一般的に悪い考えです (ブール値または係数の欠落または NA 値は静かに押しつぶされます)。 . さらに、引用符で囲まれていないテキスト フィールドでは明らかに失敗します (例外をスローします)。そのため、もろく、で保護する必要がありますtry..catch

次に、「全体的な質問は、「Python を使用して .csv または Excel 形式でデータを読み取り、整理し、合成する最も簡単な方法は何ですか?」ということだと思います」 と、くだらない csv.reader ソリューションを開くcsv.reader(..., quoting=csv.QUOTE_NONNUMERIC)

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

于 2016-08-29T02:25:36.090 に答える
4

一連の文字列を float に変換するときは、エラーをキャッチするために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 ファイルはテキスト ファイルなので、同様の機能を使用する必要があります。

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...    
于 2013-09-18T16:32:42.413 に答える
0
for y in x:
                print type(float(y)),

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

y = フロート (y)

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

于 2013-09-18T16:34:49.250 に答える