python:读取复杂的csv文件

时间:2018-01-31 15:27:25

标签: python csv numpy text

所以,我正在尝试读取一个奇怪的.csv文件,这些文件有逗号分隔值,但由于每对列代表不同的数据类型,因此用两个逗号“,,”分隔。最重要的是,在某一行之后的某些特定列中缺少值(参见下面的最小示例)

ROW1:

  

-2.418809,0.004107006,359.896,1.86897E-07,359.896,2.958411 ,, - 2.419437,0.1012164,359.9048,2.095844E-06,359.9048,-2.049214

ROW2

  

-2.41644,0.004659269 ,,,,,,,, - 2.417068,0.1013545 ,,,,,,

我尝试使用answer here中描述的方法解决问题,但没有成功,因为loadtxt无法处理缺失的值 目前我正在尝试用numpy.loadtxt读取它,只指定直到最后的列:

import numpy as np
data = np.loadtxt(name,
                  delimiter=',',
                  unpack=True,
                  usecols=(0,1,6,7))

但我收到了一个错误:

ValueError: could not convert string to float

有没有人知道是否有一种简单的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:0)

你已经打破了csv的基本原则 https://en.wikipedia.org/wiki/Comma-separated_values

复杂CSV解决方案:

Handling a complex CSV file

答案 1 :(得分:0)

第一步是,如果你说csv使用两个逗号而不是一个逗号,你应该将delimiter=',,'传递给np.loadtxt

其次,如果您需要自定义每列的解析,正如Aaron在评论中所说,您可以通过converters来自定义数据的存储方式。例如,如果您希望列2在找到并为空字符串时给出零,则执行

import numpy as np
data = np.loadtxt(name,
              delimiter=',,',
              converters = {2: lambda x: 0 if x == "" else float(x)}
              unpack=True,
              usecols=(0,1,6,7))

我没有测试代码,但是我直接从documentation检查了一下,想想你怎么能这样做。如果该代码不起作用,那么无论如何都应该是这样的。

希望它有所帮助。

答案 2 :(得分:0)

最后我发现了一种非优雅但又有效的方法:我使用了genfromtxt来更好地处理丢失的数据,默认情况下将它们视为NaN。使用逗号','作为分隔符,函数读取双逗号',,'作为逗号缺失值-逗号,所以在任何地方都有双逗号,函数的输出是NaN。完成后我刚刚删除了应用this answer here

的纳米列
import numpy as np
data = np.genfromtxt(namefile,
                     delimiter=',')
datanew = data[:, ~np.all(np.isnan(data), axis=0)]
data = np.transpose(datanew)