将格式错误的csv文件转换为numpy数组

2024-10-03 02:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有7行的csv文件,其中5行有7列,最后两行有2列。这些文件也是字符串、浮点和nan的混合。 e、 g组:

883825.00,373395.00,0.00,"20,080.84",2012500.00,#EANF#,121449.39
0.00,0.00,0.00,"38,849.10",0.00,#EANF#,0.00
0.00,0.00,0.00,"83,167.42",1640625.00,#EANF#,0.00
#EANF#,#EANF#,#EANF#,#EANF#,#EANF#,#EANF#,#EANF#
"-1,202,600.00",-0.00,#EANF#,2267168,0.00,#EANF#,"-173,710.66"
-125.60,#EANF#
"17,459.68",#EANF#.

我可以用MATLAB来阅读这个文件并进行处理。我能对纽比做同样的事吗? 我试着在这个论坛上寻找解决方案,但似乎没有任何效果。需要将字符串和nan转换为float。在


Tags: 文件csv字符串nan解决方案float论坛浮点
1条回答
网友
1楼 · 发布于 2024-10-03 02:45:56

我不确定是否有使用NumPy的解决方案,loadtxt和{}如果列数发生变化,则会分别引发错误和警告,因此您可能需要编写自己的方法。在

编辑:以下内容稍作编辑,以参考DSM的意见。

您可以使用内置的csv模块:

import csv

arr = []

with open('test.txt', 'r') as fh:
    reader = csv.reader(fh)
    for row in reader:
        if row:
            arr.extend(row)

csv方法的优点是它可以去除新行,如果您只使用fileobj = open(...)for line in fileobj读取文件,则不是这种情况。在

在这一点上你应该

^{pr2}$

然后您必须转换为float并将#EANF#值替换为numpy.NaN。我们还要处理一些值中的逗号。逗号很容易处理

float(str(float_string).replace(',', ''))

对于#EANF#值,我们可以检查一个项是否以this开头(不等于this,因为列表中的最后一个项有一个尾随的.)。将这两个转换组合成一个函数convert,并用列表理解进行包装:

import numpy

def convert(v):
    try:
        return float(v)
    except ValueError:
        if v.startswith('#EANF#'):
            return numpy.NaN
        else:
            return float(str(v).replace(',', ''))

arr = numpy.asarray([convert(a) for a in arr])

函数convert可以泛化为接受第二个可选参数,该参数定义应将哪些值映射到numpy.NaN。在

最终的结果是

>>> arr
[883825.0, 373395.0, 0.0, 20080.84, 2012500.0, nan, 121449.39, 0.0, 0.0, 0.0, 38
849.1, 0.0, nan, 0.0, 0.0, 0.0, 0.0, 83167.42, 1640625.0, nan, 0.0, nan, nan, na
n, nan, nan, nan, nan, -1202600.0, -0.0, nan, 2267168.0, 0.0, nan, -173710.66, -
125.6, nan, 17459.68, nan]

注意:这个答案假设你对结果的一维列表满意。如果你想得到一个不同的结果,你应该在问题中说出来。在

相关问题 更多 >