为什么值分配会默默地失败或做错事,我怎样才能阻止它这样做



我很难找到一个错误,它基本上归结为以下事实 第三行

import pandas as pd
df = pd.DataFrame({'a':range(4),'b':np.random.random(4)})
df.values[1:-1] = [[0.1]*2]*2

不起作用 -- 所有行都保持不变。 虽然阻止我将整数更改为浮点数至少是有意义的(尽管我希望能够规避这一点),但这似乎不是这种行为背后的原因,因为

df.values[1:-1,1] = [0.1]*2

也没有效果!奇怪的是第三行

import pandas as pd
df = pd.DataFrame({'a':range(4))})
df.values[1:-1] = [[0.1]]*2

确实有效果,尽管仍然不是您所期望的 - 相应的条目设置为零!同样,这有点道理,但我宁愿得到一个例外而不是隐式整数转换。

我认为这种行为应该改变,或者至少熊猫应该给我警告,它忽略了我告诉它做的事情。然而,在我去 github 存储库上打开一个关于它的问题之前,我首先想征求其他意见,更重要的是,我想问:

如何可靠地更改数据帧的子集(按行和列)以获取给定 numpy 数组的值(我知道这是一项黑客努力,但这就是我的数据世界的方式)

首先,不要调用.values来分配给数据。

行为差异的原因是,在您的第一个示例中:

df = pd.DataFrame({'a':range(4),'b':np.random.random(4)})

'b'是您作为数据参数传递的 numpy 数组的视图,因为构造函数识别这是一个 numpy 数组,出于效率原因,块管理器可以查看数组(无需重建数组并复制数据)。

调用.values时,这可能会也可能不会返回有关基础数据的视图。

当我们打电话给.values

In[92]:
df.values
Out[92]: 
array([[0.        , 0.02512956],
[1.        , 0.7394139 ],
[2.        , 0.7535009 ],
[3.        , 0.60658149]])

这是数据的numpy表示形式,它可能是也可能不是真实基础数据的视图。

在您的情况下,它返回的是副本而不是视图,因此为什么会这样:

df.values[1:-1] = [[0.1]*2]*2

不行。

但是,如果您使用iloc那么它确实有效:

df.iloc[1:-1] = [[0.1]*2]*2

在第二个 df 中,您只传递了一个range因此数据是在内部构建的,与传递 numpy 数组时不同,不会对传递的数据进行查看。当您调用.values时,这将返回数据视图,它恰好有效,但不能保证有效。这是应避免的不良做法,以避免这种歧义。

相关内容

最新更新