我使用numpy的.astype()
方法来转换数据类型,但是,它给出了奇怪的结果,假设以下代码:
import pandas as pd
import numpy as np
import sys
df = pd.DataFrame([[0.1, 2, 'a']], columns=["a1", "a2", "str"])
arr = df.to_records(index=False)
dtype1 = [('a1', np.float32), ('a2', np.int32), ('str', '|S2')]
dtype2 = [('a2', np.int32), ('a1', np.float32), ('str', '|S2')]
arr1 = arr.astype(dtype1)
arr2 = arr.astype(dtype2)
print(arr1)
print(arr2)
print(arr)
print(sys.version)
print(np.__version__)
print(pd.__version__)
我在不同的python版本上进行了测试,得到了不同的结果。新版本给了我意想不到的结果:
[(0.1, 2, b'a')]
[(0, 2., b'a')]
[(0.1, 2, 'a')]
3.6.5 |Anaconda custom (64-bit)| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]
1.15.0
0.23.4
虽然旧版本给出了正确的结果:
[(0.10000000149011612, 2, 'a') (0.10000000149011612, 2, 'b')]
[(2, 0.10000000149011612, 'a') (2, 0.10000000149011612, 'b')]
[(0.1, 2L, 'a') (0.1, 2L, 'b')]
2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)]
1.11.1
0.20.3
有人能告诉我发生了什么事吗?你知道吗
https://docs.scipy.org/doc/numpy/user/basics.rec.html#assignment-from-other-structured-arrays
表示来自其他结构化数组的赋值是按位置,而不是按字段名。我认为这适用于
astype
。如果是这样,就意味着不能用astype
对字段重新排序。你知道吗一次访问多个字段在最近的版本中已经发生了变化,而且可能会有更多的变化。部分原因在于,这种访问应该是副本还是视图。你知道吗
recfunctions
有添加、删除或合并字段的代码。一种常见的策略是使用新的数据类型创建一个目标数组,并按字段名将值复制到该数组中。这是迭代的,但由于通常一个数组会有比字段更多的记录,所以时间损失不大在版本1.14中,我可以:
仅使用
astype
不会对字段重新排序:但多字段索引确实:
现在
dt2
astype是正确的:这是1.14;您使用的是1.15,文档中提到了1.16中的差异。所以这是一个移动的目标。你知道吗
astype
的行为与对“blank”数组的赋值相同:相关问题 更多 >
编程相关推荐