如何修复:valueerror:无法将 float nan 转换为 int
使用 pandas 时可能遇到的错误是:
ValueError : cannot convert float NaN to integer
当您尝试将 pandas DataFrame 中的列从浮点数转换为整数且该列包含 NaN 值时,会发生此错误。
以下示例展示了如何在实践中纠正此错误。
如何重现错误
假设我们创建以下 pandas DataFrame:
import pandas as pd import numpy as np #createDataFrame df = pd. DataFrame ({' points ': [25, 12, 15, 14, 19, 23, 25, 29], ' assists ': [5, 7, 7, 9, 12, 9, 9, 4], ' rebounds ': [11, np. no , 10, 6, 5, np. no , 9, 12]}) #view DataFrame df points assists rebounds 0 25 5 11 1 12 7 NaN 2 15 7 10 3 14 9 6 4 19 12 5 5 23 9 NaN 6 25 9 9 7 29 4 12
目前,“bounces”列是“float”数据类型。
#print data type of 'rebounds' column df[' rebounds ']. dtype dtype('float64')
假设我们尝试将“bounces”列从浮点数转换为整数:
#attempt to convert 'rebounds' column from float to integer df[' rebounds '] = df[' rebounds ']. astype (int) ValueError : cannot convert float NaN to integer
我们收到一个ValueError ,因为“bounces”列中的 NaN 值无法转换为整数值。
如何修复错误
修复此错误的方法是在尝试将列从浮点转换为整数之前处理 NaN 值。
我们可以使用以下代码首先识别包含 NaN 值的行:
#print rows in DataFrame that contain NaN in 'rebounds' column print (df[df[' rebounds ']. isnull ()]) points assists rebounds 1 12 7 NaN 5 23 9 NaN
然后,我们可以删除具有 NaN 值的行或将 NaN 值替换为另一个值,然后再将列从浮点转换为整数:
方法 1:删除具有 NaN 值的行
#drop all rows with NaN values df = df. dropna () #convert 'rebounds' column from float to integer df[' rebounds '] = df[' rebounds ']. astype (int) #view updated DataFrame df points assists rebounds 0 25 5 11 2 15 7 10 3 14 9 6 4 19 12 5 6 25 9 9 7 29 4 12 #view class of 'rebounds' column df[' rebounds ']. dtype dtype('int64')
方法 2:替换 NaN 值
#replace all NaN values with zeros df[' rebounds '] = df[' rebounds ']. fillna ( 0 ) #convert 'rebounds' column from float to integer df[' rebounds '] = df[' rebounds ']. astype (int) #view updated DataFrame df points assists rebounds 0 25 5 11 1 12 7 0 2 15 7 10 3 14 9 6 4 19 12 5 5 23 9 0 6 25 9 9 7 29 4 12 #view class of 'rebounds' column df[' rebounds ']. dtype dtype('int64')
请注意,这两种方法都允许我们避免ValueError并成功将浮点列转换为整数列。
其他资源
以下教程解释了如何修复 Python 中的其他常见错误:
如何修复:列重叠但未指定后缀
如何修复:对象“numpy.ndarray”没有“append”属性
如何修复:如果使用所有标量值,则需要传递索引