对象的数据框'astype(float)`行为因列表或数组而异

piR*_*red 14 python numpy pandas

我将在前面加上声明,我首先不会这样做,并且我遇到了这个帮助朋友的事.

考虑数据框架 df

df = pd.DataFrame(pd.Series([[1.2]]))

df

       0
0  [1.2]
Run Code Online (Sandbox Code Playgroud)

这是对象是列表的对象的数据框.在我朋友的代码中,他们有:

df.astype(float)
Run Code Online (Sandbox Code Playgroud)

正如我所希望的那样打破了

ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)

但是,如果这些值是numpy数组:

df = pd.DataFrame(pd.Series([np.array([1.2])]))

df

       0
0  [1.2]
Run Code Online (Sandbox Code Playgroud)

我尝试过同样的事情:

df.astype(float)

     0
0  1.2
Run Code Online (Sandbox Code Playgroud)

它很乐意做一些事情并将我的1长度数组转换为标量.这感觉很脏!

相反,他们不是一个长度的数组

df = pd.DataFrame(pd.Series([np.array([1.2, 1.3])]))

df

            0
0  [1.2, 1.3]
Run Code Online (Sandbox Code Playgroud)

然后就打破了

ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)

问题
请告诉我这是一个错误,我们可以解决它.或者有人可以解释为什么以及在哪个世界中这是有意义的?


对@root的回应
你是对的.这值得成为问题吗?你期望/想要这个吗?

a = np.empty((1,), object)
a[0] = np.array([1.2])

a.astype(float)

array([ 1.2])
Run Code Online (Sandbox Code Playgroud)

a = np.empty((1,), object)
a[0] = np.array([1.2, 1.3])

a.astype(float)
Run Code Online (Sandbox Code Playgroud)
ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)

vmg*_*vmg 1

这是由于参数的unsafe默认值造成的。在文档中的论点castingastypecasting是这样描述的:

\n\n

“控制可能发生的数据类型转换。默认为 \xe2\x80\x98unsafe\xe2\x80\x99 以实现向后兼容性。 ”(我的重点)

\n\n

任何其他可能的铸造都会返回TypeError.

\n\n
a = np.empty((1,), object)\na[0] = np.array([1.2])\na.astype(float, casting=\'same_kind\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:

\n\n
TypeError: Cannot cast array from dtype(\'O\') to dtype(\'float64\') according to the rule \'same_kind\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这适用于除 之外的所有铸件unsafe,即:noequivsafesame_kind

\n