我使用pandas.read_csv读取excel文件,我的文件中有两列,一列是字符串类型,另一列是整数。
data = pandas.read_csv('data.csv')
然后,我为这些numpy ndarrays打印出这些数据类型。
print(type(data.get_values()[0, 0]))
print(type(data.get_values()[0, 1]))
结果:
<class 'str'>
<class 'int'>
它告诉我有一种方法可以在同一个numpy ndarrays中添加两种不同的数据类型。
然而,当我想尝试在同一个numpy ndarrays中添加两种不同数据类型的数据时:
arr = numpy.ndarray((1, 2))
arr[0][0] = 1
arr[0][1] = 'str'
控制台向我显示了这些信息:
ValueError: could not convert string to float: 'str'
有没有人可以像班级熊猫那样告诉我怎么做?
答案 0 :(得分:2)
您可以为每个字段创建具有任意C样式数据类型的numpy ndarray
。诀窍首先是create the datatype for the array,然后将其设置为数组的dtype
。唯一令人烦恼的是,因为它们是C风格的类型,所以必须明确定义类型,如果你有字符串,则包括设置每个字段可以包含的字符数。
例如:
>>> import numpy as np
>>> person_dt = np.dtype([('Name', 'S25'), ('Age', np.uint8)])
>>> person_dt
dtype([('Name', 'S25'), ('Age', 'u1')])
>>> persons = np.array([('alice', 35), ('bob', 39)], dtype=person_dt)
>>> persons
array([(b'alice', 35), (b'bob', 39)],
dtype=[('Name', 'S25'), ('Age', 'u1')])
我在这里创建了一个numpy dtype
。数组的每个单独部分都是field
,我将Name
和Age
分配给这些字段的名称,并为每个字段指定类型。所以Name
字段是一个25个字符或更少的字符串(这是一个\0
终止的字符串,就像你在C中所拥有的那样,而且年龄是无符号整数,因为我们的年龄当然会更少请注意{4}之前的b
表示类型为byte-string
然后我只使用新的dtype
创建数组并传入值。
关于这一点很酷,你可以获取它们所属的字段的值。例如,您可以通过抓取Age
字段获取所有年龄段,并且它将具有我指定年龄的类型:
>>> persons['Age']
array([35, 39], dtype=uint8)
所以你可以进一步索引这些结果数组:
>>> persons['Name'][1]
b'bob'
您仍然可以像平常一样创建和分配:
>>> new_persons = np.zeros(5, dtype=person_dt)
>>> new_persons
array([(b'', 0), (b'', 0), (b'', 0), (b'', 0), (b'', 0)],
dtype=[('Name', 'S25'), ('Age', 'u1')])
>>> new_persons[0] = ('alice', 25)
>>> new_persons[1] = ('bob', 26)
>>> new_persons['Name'][2:5]
array([b'', b'', b''],
dtype='|S25')
>>> new_persons['Name'][2:5] = 'carol', 'david', 'eve'
>>> new_persons['Age'][2:5] = 27, 28, 29
>>> new_persons
array([(b'alice', 25), (b'bob', 26), (b'carol', 27), (b'david', 28), (b'eve', 29)],
dtype=[('Name', 'S25'), ('Age', 'u1')])
我刚才参加了一个关于创建和管理numpy dtypes
的演讲,这很棒;谈话的Jupyter笔记本是在线的,您可以access it here,这可能会更清楚地说明您可以使用它们的所有不同方式。