gpt4 book ai didi

python - 使用 genfromtxt 加载数据时如何替换值

转载 作者:行者123 更新时间:2023-12-01 07:38:35 27 4
gpt4 key购买 nike

我想知道当从具有多列的给定 (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.wherenp.where(data!=0.0 ,data, -999) 但我收到错误:

TypeError: invalid type promotion

我不知道我错过了什么......

ps 1.也许可以用 pandas 解决,但我正在寻找一个独立的解决方案

ps 2. 我知道一个肮脏的解决方法是将不正确的值(0.0s)设置为初始文件中的缺失标志,但是我们想要排除多个值吗? (或将数据与不同的标志组合起来)

最佳答案

定义一个简单的文本:

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

使用 bool 测试(或 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]])

关于python - 使用 genfromtxt 加载数据时如何替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836032/

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