Pandas:ValueError:无法将float NaN转换为整数

时间:2017-11-16 15:17:45

标签: python pandas csv

我得 ValueError:无法将float NaN转换为整数以便跟随:

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • “x”显然是csv文件中的一列,但是我无法在文件中发现任何 float NaN ,并且不知道这是什么意思。
  • 当我把这个列读成String时,它的值就像-1,0,1,... 2000,对我来说看起来都很好看。
  • 当我将列读取为float时,可​​以加载它。然后它显示值为-1.0,0.0等,仍然没有任何NaN-s
  • 我尝试使用read_csv中的 error_bad_lines = False 和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)

5 个答案:

答案 0 :(得分:11)

要识别NaN值,请使用boolean indexing

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

然后,要移除所有非数字值,请使用带有errors='coerce' NaN的{​​{3}} - 它将非数字替换为df['x'] = pd.to_numeric(df['x'], errors='coerce') s:

NaN

要删除x列中df = df.dropna(subset=['x']) 的所有行,请使用to_numeric

int

上次将值转换为df['x'] = df['x'].astype(int) s:

appSettings

答案 1 :(得分:4)

此外,即使在最新版本的pandas上,如果列是 object 类型,您也必须首先将其转换为float,例如:

df['column_name'].astype("Float32").astype("Int32")

float和int的大小(如果是32或64)取决于您的变量,请注意,如果数字对于格式来说太大,则可能会降低精度。

答案 2 :(得分:2)

我知道已经回答了这个问题,但希望将来为任何人提供替代解决方案:

您可以使用.loc仅按notnull()的值对数据框进行子集设置,然后仅对'x'列进行子集设置。取相同的向量,然后apply(int)

如果x列是浮动的:

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

答案 3 :(得分:0)

  

ValueError:无法将float NaN转换为整数

实际上,您可以从v0.24开始。熊猫引入了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类型(从Int16Int32Int64中选择),

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

答案 4 :(得分:0)

如果您具有空值,那么在进行数学运算时,如果您希望数据集不可更改,则会使用df[~df['x'].isnull()]df[['x']].astype(int)来解决此错误。