1. ホーム
  2. python

[解決済み] パンダです。ValueError: float の NaN を整数に変換できない

2022-03-01 11:33:44

質問

私は ValueError: float NaN を整数に変換できません。 は以下の通りです。

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)

  • x"は、明らかにcsvファイルのカラムです。 フロートNaN というのはどういう意味なのでしょうか?
  • カラムを文字列として読むと、-1,0,1,...2000のような値があり、私にはすべてとても素敵なint型数値に見えます。
  • floatとして読み込むと、読み込むことができます。すると、-1.0,0.0などの値が表示されますが、NaNは表示されません。
  • で試してみました。 error_bad_lines = False とする。 とread_csvのdtypeパラメータを指定しても効果がありません。同じ例外が発生して読み込みがキャンセルされるだけです。
  • ファイルは小さくない(10M行以上)ので、手動で検査することはできません。小さなヘッダー部分を抽出すると、エラーは発生しませんが、ファイル全体では発生します。つまり、ファイルの中に何かあるのですが、それが何なのかがわかりません。
  • 論理的にはcsvに欠損値はないはずですが、たとえゴミがあったとしても、その行をスキップしても構わないと思っています。しかし、ファイルをスキャンして、変換エラーを報告する方法が見当たりません。

更新:コメント/回答のヒントを使用して、私はこれで私のデータをきれいにしました。

# x contained NaN
df = df[~df['x'].isnull()]

# Y contained some other garbage, so null check was not enough
df = df[df['y'].str.isnumeric()]

# final conversion now worked
df[['x']] = df[['x']].astype(int)
df[['y']] = df[['y']].astype(int)

解決方法は?

識別のために NaN の値を使用します。 boolean indexing :

print(df[df['x'].isnull()])

次に、数値以外の値をすべて削除するには to_numeric をパラメータとする errors='coerce' - に置き換えることで、数値以外を NaN s:

df['x'] = pd.to_numeric(df['x'], errors='coerce')

そして、すべての行を削除するために NaN の列の x 使用 dropna :

df = df.dropna(subset=['x'])

最後に値を変換して int s:

df['x'] = df['x'].astype(int)