web-dev-qa-db-ja.com

パンダ:ValueError:float NaNを整数に変換できません

私はValueError:float NaNを整数に変換できませんを取得します:

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • 「x」はcsvファイルの列ですが、ファイル内のfloat NaNを見つけることはできません。この。
  • 列を文字列として読み取ると、-1、0、1、... 2000のような値があり、すべてが非常に良いint数値に見えます。
  • 列をフロートとして読み取ると、これをロードできます。次に、値が-1.0,0.0などとして表示されますが、まだNaN-sはありません
  • error_bad_lines = Falseとread_csvのdtypeパラメータを使用してみましたが、役に立ちませんでした。同じ例外でロードをキャンセルするだけです。
  • ファイルは小さくないため(10行以上)、手動で検査することはできません。小さなヘッダー部分を抽出してもエラーはありませんが、ファイル全体で発生します。そのため、ファイル内の何かですが、何を検出できません。
  • 論理的には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)
17
JaakL

NaN値を識別するには、 boolean indexing を使用します。

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

次に、数値以外の値をすべて削除するには、parameetr to_numericerrors='coerce' を使用します。非数値をNaNsに置き換えます。

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

また、列NaNxsを持つすべての行を削除するには、 dropna を使用します。

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

最後の値をintsに変換:

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

私はこれが回答されていることを知っていますが、将来誰にでも代替ソリューションを提供したいと考えました:

.locを使用して、notnull()の値のみでデータフレームをサブセット化し、'x'列のみをサブセット化できます。同じベクトルを取り、apply(int)します。

列xがfloatの場合:

df.loc[df['x'].notnull(), 'x'] = df.loc[df['x'].notnull(), 'x'].apply(int)
3
Matt W.

ValueError:float NaNを整数に変換できません

V0.24から、実際にできます。 Pandasは Nullable Integer Data Types を導入します。これにより、整数をNaNと共存させることができます。

データが欠落している一連の浮動小数点数を考えると、

s = pd.Series([1.0, 2.0, np.nan, 4.0])
s

0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

s.dtype
# dtype('float64')

を使用して、null可能なint型に変換できます(Int16Int32、またはInt64のいずれかを選択)。

s2 = s.astype('Int32') # note the 'I' is uppercase
s2

0      1
1      2
2    NaN
3      4
dtype: Int32

s2.dtype
# Int32Dtype()

キャストを行うには、列に整数が必要です。それ以外はTypeErrorを発生させます:

s = pd.Series([1.1, 2.0, np.nan, 4.0])

s.astype('Int32')
# TypeError: cannot safely cast non-equivalent float64 to int32
2
cs95

null値がある場合、数学的操作を行うときにこのエラーが発生し、データセットを変更できないようにするにはdf[~df['x'].isnull()]df[['x']].astype(int)を使用して解決します。

0
SATYAJIT MAITRA