如何用genfromtx加载数据时替换值

2024-10-06 11:20:31 发布

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

我想知道当从一个给定的(csv)文件加载数据时,如何用多列替换特定的值,将字符串和数值结合起来。你知道吗

在下面的示例中,假设您有许多地理位置,具有已知的纬度和经度,以及一组特定的属性(P1-P5)和一个类(仅包括问题的字符串部分)。有些缺少的值被genfromtxt正确替换(本例中缺少的值是-999),另外还有一些不正确的值(假,或其他类型的标志),如0.0。如何将0.0替换为-999?你知道吗

数据:

Name,lat,long,P1,P2,P3,P4,P5,Class
id1,71.234,10.123,0.0,11,212,222,1920,A
id2,72.234,11.111,,,312,342,1920,A
id3,77.832,12.111,1,0.0,,333,4520,B
id4,77.987,12.345,3,0.0,,231,2020,B
id5,77.111,13.099,5,11,212,222,1920,A

目前为止的代码是:

dfile = "data.csv"
missing_value = -999

import numpy as np

data = np.genfromtxt(dfile, unpack=True, comments='#', names=True, 
                    autostrip='Yes', filling_values=missing_value,
                    dtype=('S5', 'float', 'float', 'float', 'float', 'float', 'float', 'S1')
                    , delimiter=',',
                    )
new_data = np.where(data!=0.0 ,data, -999)

我使用了np.where(数据!=0.0,data,-999),但我得到了一个错误:TypeError: invalid type promotion

我不知道我错过了什么。。。你知道吗

第1页。也许这是解决熊猫,但我正在寻找一个独立的解决方案

第2页。我知道一个棘手的解决方法是将不正确的值(0.0s)设置为初始文件中缺少的标志,但是我们要排除的多个值是什么?(或组合具有不同标志的数据)


Tags: 文件csv数据字符串truedatavalue标志
2条回答

定义简单文本:

In [55]: txt= '''foo,bar,test 
    ...: a,1,2 
    ...: b,3,4 
    ...: ''' 

加载genfromtxt

In [60]: data = np.genfromtxt(txt.splitlines(), encoding=None, names=True, dtype=None, delimiter=',')           
In [61]: data                                                                                                   
Out[61]: 
array([('a', 1, 2), ('b', 3, 4)],
      dtype=[('foo', '<U1'), ('bar', '<i8'), ('test', '<i8')])

请注意具有不同数据类型和名称的数据类型字段。你知道吗

按名称访问字段:

In [64]: data['foo']                                                                                            
Out[64]: array(['a', 'b'], dtype='<U1')

按索引修改一个字段:

In [65]: data['bar']                                                                                            
Out[65]: array([1, 3])
In [66]: data['bar'][0] = 23                                                                                    

用布尔测试(或where)修改另一个:

In [67]: test = data['test']                                                                                    
In [68]: test                                                                                                   
Out[68]: array([2, 4])
In [69]: test==2                                                                                                
Out[69]: array([ True, False])
In [70]: test[test==2]=0                                                                                        
In [71]: test                                                                                                   
Out[71]: array([0, 4])
In [72]: data                                                                                                   
Out[72]: 
array([('a', 23, 0), ('b',  3, 4)],
      dtype=[('foo', '<U1'), ('bar', '<i8'), ('test', '<i8')])

如果将数字字段分组为一个字段,则替换可能更容易(但这需要更多地了解结构化数组数据类型):

In [80]: data = np.genfromtxt(txt.splitlines(), encoding=None, skip_header=1, dtype=[('id','U3'),('foo',int,2)],
    ...:  delimiter=',')                                                                                        
In [81]: data                                                                                                   
Out[81]: 
array([('a', [1, 2]), ('b', [3, 4])],
      dtype=[('id', '<U3'), ('foo', '<i8', (2,))])
In [82]: data['foo']                                                                                            
Out[82]: 
array([[1, 2],
       [3, 4]])

在我看来,问题在于np.genfromtxt文件部分。它创建一个numpy数组,其形式如下:

np.array([np.void, np.void ... ])

这导致了np.哪里失败。解决这个问题的一种方法是:

data = np.array([[i for i in j] for j in data])

我认为这不是一个很好的解决方案。但在有人给出真正的答案之前,它应该是有效的。

相关问题 更多 >