gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:24 24 4
gpt4 key购买 nike

我有一个 7 行的 csv 文件,其中 5 行有 7 列,最后两行有 2 列。这些文件也是字符串、 float 和 NaN 的混合。例如:

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 读取该文件并对其进行处理。我可以用 numpy 做同样的事情吗?我尝试在这个论坛上寻找解决方案,但似乎没有任何效果。需要将字符串和 NaN 转换为 float 。

最佳答案

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

编辑:以下内容经过轻微编辑,以反射(reflect) 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< 读取文件,则情况并非如此。/.

此时你应该已经

>>> arr
['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.0
0', '0.00', '83,167.42', '1640625.00', '#EANF#', '0.00', '#EANF#', '#EANF#', '#E
ANF#', '#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#.']

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

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

对于#EANF#值,我们可以检查一个项目是否以此开头(不等于这个,因为列表中的最后一个项目有一个尾随 )。将这两个转换组合成一个函数 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]

注意:此答案假设您对一维列表作为结果感到满意。如果您想要不同的结果形状,您应该在问题中这么说。

关于python - 将格式错误的 csv 文件转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10930908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com