use*_*092 6 python numpy pandas
我有一个数据框,我正在查看与每列相关的数据类型.
当我跑:
In [23]: df.dtype.descr
Out [24]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|O')]
Run Code Online (Sandbox Code Playgroud)
我想将货币dtype设置为S7.我在做:
In [25]: dtype_new[-1] = (u'currency', "|S7")
In [26]: print dtype_new
Out [27]: [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', '|S7')]
Run Code Online (Sandbox Code Playgroud)
它看起来是正确的格式.所以我试着把它放回我的df:
In [28]: df = df.astype(np.dtype(dtype_new))
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TypeError('data type not understood',)
Run Code Online (Sandbox Code Playgroud)
我应该改变什么?谢谢.这是在我最近更新anaconda之前工作的,我不知道这个问题.谢谢.
调整:
df.dtype是
In [23]: records.dtype
Out[23]: dtype((numpy.record, [(u'date', '<i8'), (u'open', '<f8'), (u'high', '<f8'), (u'low', '<f8'), (u'close', '<f8'), (u'volume', '<f8'), (u'dividend', '<f8'), (u'adj_factor', '<f8'), (u'split_factor', '<f8'), (u'liq', '<f8'), (u'currency', 'O')]))
Run Code Online (Sandbox Code Playgroud)
如何将"0"更改为少于7个字符的字符串?
如何将最后一个dtype从"O"更改为其他类型?特别是一个少于7个字符的字符串.
最后 - 这是一个unicode问题吗?使用Unicode:
In [38]: np.dtype([(u'date', '<i8')])
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-38-8702f0c7681f> in <module>()
----> 1 np.dtype([(u'date', '<i8')])
TypeError: data type not understood
Run Code Online (Sandbox Code Playgroud)
没有Unicode:
In [39]: np.dtype([('date', '<i8')])
Out[39]: dtype([('date', '<i8')])
Run Code Online (Sandbox Code Playgroud)
看起来你已经集中了关于unicode的观点,实际上,你似乎已经触及了一个痛点.
让我们从最后的numpy文档开始.
文档dtypes 指出:
[(field_name, field_dtype, field_shape), ...]
obj应该是一个字段列表,其中每个字段由长度为2或3的元组描述.(相当于属性中的
descr
项目__array_interface__
.)第一个元素
field_name
是字段名称(如果这是''
一个标准字段名称,则指定'f#').字段名称也可以是2元组的字符串,其中第一个字符串是"标题"(可以是任何字符串或unicode字符串)或字段的元数据,可以是任何对象,第二个字符串是"name"必须是有效的Python标识符.第二个元素field_dtype
可以是任何可以解释为数据类型的元素.field_shape
如果此字段表示第二个元素中数据类型的数组,则可选的第三个元素包含形状.请注意,第三个参数等于1的3元组相当于2元组.此样式不接受dtype构造函数中的align,因为假定所有内存都由数组接口描述来解释.
所以doc似乎没有真正指定字段名是否可以是unicode,我们可以从doc中确定的是,如果我们将元组定义为字段名称,例如((u'date', 'date'), '<i8')
,然后使用unicode作为"标题"(通知,仍然不是为了这个名字!),导致没有错误.
否则,在这种情况下,如果您定义,((u'date', u'date'), '<i8')
您将收到错误.
现在,您可以使用在Py2中使用unicode名称 encode("ascii")
(u'date'.encode("ascii"))
Run Code Online (Sandbox Code Playgroud)
这应该工作.
一个重要的一点是,对于Py2,Numpy不允许将dtype
unicode字段名称指定为元组列表,但允许使用字典.
如果我不在Py2中使用unicode名称,我可以将最后一个字段更改为|0
,|S7
或者encode("ascii")
如果将名称定义为unicode字符串,则必须使用.
而且涉及的错误......
要了解为什么它会发生在您所看到的内容中,了解Numpy和Pandas中报告的错误/问题以及相关讨论是很有用的.
Numpy
https://github.com/numpy/numpy/issues/2407
您可以在讨论中注意到(我在此不报告)主要有以下几点:
encode("ascii")
在unicode字符串上使用'whatever'
字符串在Py2/3中具有不同的默认值(字节/ unicode){'names':[ alist], 'formats':[alist]...}
,那么py2 case也允许unicode名称" 熊猫
也在熊猫方面报道了一个与numpy问题有关的问题:https://github.com/pandas-dev/pandas/pull/13462
它似乎已经修复了很久以前.