numpy.genfromtxt()无法读取标头

时间:2019-08-19 07:02:47

标签: python-3.x numpy

我正在尝试使用numpy.genfromtxt()读取csv。文件,但我无法使其正确读取标题。

默认情况下,该函数不会跳过标头,但由于每列中的值都是数字,因此似乎将var type设置为float(对于整个列),此时它将标头行检测为缺少值并返回NaN。

这是我的代码:

import numpy


dataset = numpy.loadtxt('datasets/BAL_dataset01.csv',
                        delimiter=',')
print(dataset[0:5])

这是我的.csv的前7行:

patient_nr,Age,Native_CD45,LYM,Macr,NEU
1,48,35.8,3.4,92.5,3.7
1,48,14.5,12.6,78.3,1.2
1,48,12.1,5.6,87.1,4.3
1,48,5.6,25.9,72.7,0.4
1,49,13.2,N/A,N/A,N/A
2,18,43.0,17.9,76.2,4.2
3,59,53.2,1.07,47.8,49.6

这是结果数组:

[[ nan  nan  nan  nan  nan  nan]
 [ 1.  48.  35.8  3.4 92.5  3.7]
 [ 1.  48.  14.5 12.6 78.3  1.2]
 [ 1.  48.  12.1  5.6 87.1  4.3]
 [ 1.  48.   5.6 25.9 72.7  0.4]]

Process finished with exit code 0

我尝试将编码设置为'UTF-8-sig'并使用参数,但无济于事。我尝试了numpy.loadtxt(),但对我来说不起作用,因为数据集中缺少值

对我来说唯一有效的解决方案是在单独的数组中读取第一行,然后将它们连接起来。

是否有更优雅的解决方案,可以在保留值的浮点性质的同时将标头读取为字符串?我可能在这里错过了一些琐碎的事情。

最好使用numpy或其他程序包–我不喜欢在各处创建循环,也就是站在停车场时重新发明了车轮。

感谢您的所有输入。

2 个答案:

答案 0 :(得分:1)

评论者 hpaulj 的解决方案为我完成了工作:

使用名称= True和dype = None(可能编码= None),应生成结构化数组。看它的形状和dtype。或使用skip_header参数,并接受浮点数。

也适合任何以numpy开头但不喜欢我阅读完整文档的人: 列的名称不存储在数组本身中,而是存储在其.dtype.names中。而且因为我不在那儿,所以我看不到该代码适用于names = True。

工作代码:

import numpy

dataset = numpy.genfromtxt('datasets/BAL_dataset01.csv',
                           delimiter=',',
                           encoding='UTF-8-sig',
                           dtype=None,
                           names=True)

print(dataset[0:7])
print(dataset.dtype.names)

答案 1 :(得分:0)

这对于numpy甚至标准lib(csv)都是可行的,但我建议您考虑一下pandas软件包(其重点是处理CSV-像数据一样。)

import pandas as pd

file_to_read = r'path/to/your/csv'

res = pd.read_csv(file_to_read)
print(res)

“ N / A”将以NaN的形式显示(有关更多选项,请参见the doc for pandas.read_csv中的参数na_valueskeep_default_na)。