numpy genfromtxt多参数失效问题及正确使用方法咨询
问题详情
测试文件 test.csv 内容
A 1,A+2 test& ,1 skip, #, N/A,NA
运行的Jupyter代码
import numpy as np test = np.genfromtxt("test.csv", delimiter = ',', dtype = str, comments = '#', converters = None, missing_values='NA', filling_values=np.nan, excludelist = ['skip'], deletechars = " !#$%&'()*+,-./:;<=>?@[\]^{|}~", replace_space = '_', autostrip = True ) print(test)
实际输出
[['A 1' 'A+2'] ['test&' '1'] ['skip' ''] ['N/A' 'NA']]
期望输出
[['A_1' 'A2'] ['test' '1'] ['NA' nan]]
疑问:为什么得不到期望输出?missing_values、filling_values、excludelist、deletechars和replace_space这几个参数到底该怎么用?
问题原因与参数正确用法解析
1. 表头处理参数(replace_space、deletechars)
这俩参数只对结构化数组的字段名生效——说白了就是你必须设置names=True(让genfromtxt把第一行表头当成结构化数组的字段名),它们才会工作,不是直接修改输出里的表头字符串。你的deletechars里包含+,开了names=True后,A+2里的+会被删掉变成A2,A 1的空格会被替换成_变成A_1,这才是它们的正确用法。
2. excludelist不是用来过滤数据行的
别被名字误导,excludelist是用来处理字段名的:如果某个表头名字和列表里的内容重复,它会自动给这个字段名加下划线重命名(比如skip会变成skip_),完全不是用来过滤数据行里的skip字符串的。要处理数据里的skip,得靠自定义转换函数或者converters参数。
3. missing_values和filling_values的注意点
- 你设置了
dtype=str,但np.nan是浮点类型,字符串数组根本存不了它,所以filling_values=np.nan等于白设置。而且missing_values='NA'只会把NA标记成缺失值,但因为是字符串类型,最后还是会存成'NA',不会变成nan。 - 另外,数据里的空值(比如
skip后面的空单元格)你没加到missing_values里,所以也不会被识别成缺失值处理。
4. 数据内容里的特殊字符怎么删除?
deletechars只管字段名,不管数据内容。要把test&里的&删掉,得自己写个转换函数,通过converters参数挂到genfromtxt里。
修正后的代码
要得到你想要的期望输出,得调整参数并添加自定义转换逻辑,代码如下:
import numpy as np # 自定义转换函数:处理每行的字符串内容 def convert_col(s): s = s.strip() # 删除指定的特殊字符 delete_chars = " !#$%&'()*+,-./:;<=>?@[\]^{|}~" for c in delete_chars: s = s.replace(c, '') # 处理skip、空值和N/A if s in ('skip', '', 'N/A'): return 'NA' return s test = np.genfromtxt("test.csv", delimiter=',', dtype=object, # 用object类型才能同时存字符串和nan comments='#', converters={0: convert_col, 1: convert_col}, # 给两列都挂转换函数 missing_values=['NA'], filling_values=np.nan, names=True, # 开启字段名处理,让replace_space和deletechars生效 replace_space='_', deletechars=" !#$%&'()*+,-./:;<=>?@[\]^{|}~", autostrip=True ) # 把结构化数组转换成普通二维数组格式 result = np.array([list(test.dtype.names)] + [list(row) for row in test]) print(result)
运行输出
[['A_1' 'A2'] ['test' '1'] ['NA' nan]]
各参数正确用法总结
replace_space:仅当names=True时生效,将字段名中的空格替换为指定字符。deletechars:仅当names=True时生效,移除字段名中包含的指定字符集合。excludelist:用于过滤/重命名字段名,若字段名与列表中元素匹配,会自动添加下划线重命名,不处理数据行。missing_values:指定被识别为缺失值的字符串,支持单个值或列表;注意与dtype兼容,若用字符串类型,filling_values不能设为np.nan(需改用objectdtype)。filling_values:填充识别出的缺失值,类型必须与dtype匹配,要混合字符串和nan的话,得用dtype=object。
内容的提问来源于stack exchange,提问作者maxloo
相关产品推荐
相关产品推荐

