我在pandas数据帧中发现了奇怪的值赋值限制。这是一个简单的插图
from __future__ import print_function
from pandas import DataFrame
import numpy as np
data=DataFrame({'one':[1,2],'two':[3.0,4]})
data.values[1,1]=data.values[1,1]*6 # these are type<numpyfloat64>
print(data.values[1,1])
#still returns 4.0 instead of expected 24.0
我很感激为什么会发生这种情况的解释。
答案 0 :(得分:4)
当您访问values
对象的NDFrame
属性时,会在其类型中收到同类的数组。也就是说,values
会返回单 dtype
的数组,这是dtype
中DataFrame
列中最大的精度。在您的情况下,one
是int64
dtype
,而two
是float64
。当您调用values
时,最终会发生concatenate
样式操作,并且这些操作始终会返回副本,这就是您无法分配并查看数据中的副作用的原因。
答案 1 :(得分:0)
data.values
是一个单独的数组,而不是对原始对象的引用。它只是从data
读取数据。是的,它不会改变原始值,因为它不代表它们,它基本上是它们的副本。
要直接更改值,请使用loc:
data.loc[1, 'one'] *= 6
答案 2 :(得分:0)
与轴标签不同,值属性本身无法分配给。
因此这是预期的行为。以下代码是一种更改值的方法。
data.two[1] = data.two[1] * 6