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

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(需改用object dtype)。
  • filling_values:填充识别出的缺失值,类型必须与dtype匹配,要混合字符串和nan的话,得用dtype=object。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:17:22