2017-01-30 7 views
6

私はさまざまなCSVファイルを持っており、それらをDataFrameとしてインポートします。問題は、多くのファイルが欠損値に対して異なるシンボルを使用していることです。いくつかはNa、他のNaN、ND、None、Missingなどを使用するか、空のエントリだけを使用します。これらの値をすべてnp.nanに置き換える方法はありますか?つまり、データフレーム内の数値以外の値はnp.nanになります。お手伝いありがとう。私は私が何を考えていpandasデータフレームの非数値項目をNaNに置き換えるにはどうすればいいですか?

+3

'read_csv'は' na_value'引数を受け取ります。可能なna値のリストを渡すことができます。そうでなければ、dfの 'to_numeric(errors = 'coerce')'を呼び出すことができます – EdChum

+0

関連項目:http:// stackoverflow .com/questions/15891038 /後処理オプションのためのpandas-change-data-type-of-columns – EdChum

+0

ありがとうEdChym、これは役に立ちます。 – user6566438

答えて

4

が比較的エレガントなだけでなく、強力な方法である:

def isnumber(x): 
    try: 
     float(x) 
     return True 
    except: 
     return False 

df[df.applymap(isnumber)] 

場合、それは明確ではありません:あなたは、あなたが持っているものは何でも入力がfloatに変換できる場合にのみ、Trueを返す関数を定義します。そのブール値のデータフレームでdfをフィルタリングします。このブール値フレームは、フィルタリングしなかったセルに自動的にNaNを割り当てます。私が試した

別の解決策は、

import number 
def isnumber(x): 
    return isinstance(x, number.Number) 

としてisnumberを定義することでしたが、私はそのアプローチはあまり気に入っているあなたが誤ってそれらを除外するだろうので、あなたが誤って、文字列として番号を持つことができることです。これはまた、データフレームが数字99と同じ文字列を表示することを知っている間違ったエラーです。

EDIT:

あなたのケースでは、おそらくまだ'nan'のすべての異なる大文字表記上のfloat作品という理由で、フィルタリング後のdf = df.applymap(float)する必要がありますが、あなたは明示的に彼らはまだ文字列で考慮されますそれらを変換するまでデータフレーム

+1

洗練されたソリューション – user6566438

関連する問題