You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用numpy.genfromtxt读取含缺失值CSV时填充值异常及isnan失效问题

解决numpy genfromtxt读取含缺失值CSV时的最小值计算问题

问题描述

我尝试使用genfromtxt读取包含'na'和'-'缺失值的CSV文件,需要找出数据中的price最小值,但缺失值被返回为-1。

我的代码如下:

data = np.genfromtxt('median-resale-prices-for-registered-applications-by-town-and-flat-type.csv',
                     skip_header=1,
                     dtype=[('quarter', 'U7'),  ('town', 'U50'), ('flat_type', 'U10'), ('price', 'i8')], delimiter=",",
                     missing_values=['na','-'], filling_values=[0])

min_price = np.min(data['price'])
print(min_price)

运行后得到的结果是-1。

我还尝试使用isnan()处理:

print("Original data: " + str(data.shape))
null_rows = np.isnan(data['price'])
print(null_rows)
nonnull_values = data[null_rows==False]
print("Filtered data: " + str(nonnull_values.shape))

但Python并未将'na'和'-'识别为nan,输出结果为:

Original data: (9360,)
[False False False ... False False False]
Filtered data: (9360,)

请问我的代码存在什么问题?

问题原因

  1. 整数类型无法存储NaN:你给price字段指定的是整数类型i8,而NaN是浮点数类型,numpy的整数数组无法容纳NaN。此时即使设置了missing_values,numpy会将无法解析的缺失值填充为整数类型的默认填充值(-1)——你的filling_values只传了一个值,仅对应第一个字段quarter,其他字段会使用各自类型的默认填充值。
  2. isnan无法识别整数数组的缺失值:np.isnan()仅对浮点数类型有效,整数数组里的-1会被当作正常整数,不会被识别为缺失值。

解决步骤

1. 修改price字段的 dtype 为浮点数

将price的类型改为f8(双精度浮点数),这样就能存储NaN,同时为每个字段指定对应的填充值:

import numpy as np

data = np.genfromtxt('median-resale-prices-for-registered-applications-by-town-and-flat-type.csv',
                     skip_header=1,
                     dtype=[('quarter', 'U7'),  ('town', 'U50'), ('flat_type', 'U10'), ('price', 'f8')], 
                     delimiter=",",
                     missing_values=['na','-'], 
                     filling_values=['', '', '', np.nan])  # price字段用np.nan填充缺失值

2. 计算最小值时忽略NaN

使用np.nanmin()直接计算忽略NaN后的最小值:

min_price = np.nanmin(data['price'])
print(min_price)

或者用布尔索引过滤掉NaN后再求最小值:

non_null_prices = data['price'][~np.isnan(data['price'])]
min_price = np.min(non_null_prices)
print(min_price)

补充说明

如果需要最终得到整数类型的price最小值,可以先过滤NaN再转换类型:

non_null_prices = data['price'][~np.isnan(data['price'])].astype('i8')
min_price = np.min(non_null_prices)

内容的提问来源于stack exchange,提问作者Yue Min

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:45:38