Pandas使用什么规则来生成视图和副本?我对Pandas在决定数据帧中的选择是原始数据帧的副本还是原始数据的视图时所使用的规则感到困惑。如果我有,例如,df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))我明白a query返回一个副本,就像这样foo = df.query('2 < index <= 5')foo.loc[:,'E'] = 40对原始数据帧没有影响df。我也理解标量或命名切片返回一个视图,以便分配给这些,例如df.iloc[3] = 70要么df.ix[1,'B':'E'] = 222会改变df。但是当谈到更复杂的案件时,我迷失了方向。例如,df[df.C <= df.B] = 7654321变化df,但是df[df.C <= df.B].ix[:,'B':'E']才不是。是否有一个简单的规则,熊猫正在使用,我只是缺少?在这些特定情况下发生了什么; 特别是,如何更改满足特定查询的数据帧中的所有值(或值的子集)(正如我在上一个示例中尝试做的那样)?
2 回答
繁花如伊
TA贡献2012条经验 获得超12个赞
这是规则,后续覆盖:
所有操作都会生成副本
如果
inplace=True
提供,它将就地修改; 只有一些操作支持这一点设置的索引器,例如
.loc/.iloc/.iat/.at
将设置到位。获取单个dtyped对象的索引器几乎总是一个视图(取决于内存布局,它可能不是这就是为什么这不可靠)。这主要是为了提高效率。(上面的示例是for
.query
;这将始终返回一个副本作为其评估者numexpr
)获取多重对象对象的索引器始终是副本。
你的榜样 chained indexing
df[df.C <= df.B].loc[:,'B':'E']
不能保证工作(因此你永远不会这样做)。
相反:
df.loc[df.C <= df.B, 'B':'E']
因为这更快,并将始终有效
链式索引是2个独立的python操作,因此不能被pandas可靠地拦截(你经常会得到一个SettingWithCopyWarning
,但这也不是100%可检测的)。您指出的开发文档提供了更全面的解释。
慕容3067478
TA贡献1773条经验 获得超3个赞
pandas依赖于numpy来确定是否生成了视图。在单个dtype情况下(对于一个系列可以是1-d,对于帧可以是2-d)。numpy 可能会生成一个视图; 这取决于你正在切片的东西; 有时你可以得到一个观点,有时你不能。大熊猫完全不依赖于这个事实,因为视图是否生成并不总是很明显。但这并不重要,因为loc在设置时不依赖于此。然而,当链索引这是非常重要的(因此为什么链索引是坏的)
添加回答
举报
0/150
提交
取消