我正在尝试使用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或其他程序包–我不喜欢在各处创建循环,也就是站在停车场时重新发明了车轮。
感谢您的所有输入。
答案 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_values
和keep_default_na
)。