Pandas使用什么规则来生成视图和副本?

我对Pandas在决定从数据框中select原始数据框的副本或原始视图时使用的规则感到困惑。

如果我有,例如,

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9)) 

我明白, query返回一个副本,以便类似的东西

 foo = df.query('2 < index <= 5') foo.loc[:,'E'] = 40 

将不会对原始dataframedf 。 我也明白,标量或命名切片返回一个视图,以便这些分配,如

 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'] 

才不是。

有一个简单的规则,pandas使用,我只是失踪? 这些具体情况是怎么回事? 特别是,如何在满足特定查询的数据框中更改所有值(或值的子集)(如我在上面的示例中试图做的那样)?


注:这与这个问题不一样, 我已经阅读了文档 ,但没有受到启发。 我也读过了关于这个主题的“相关”的问题,但是我仍然错过了pandas正在使用的简单规则,以及如何将它应用到 – 例如 – 修改值(或值的子集)在满足特定查询的数据框中。

这是规则,后续覆盖:

  • 所有操作生成一个副本

  • 如果提供了inplace=True ,它将inplace=True修改; 只有一些操作支持这一点

  • 设置例如.loc/.ix/.iloc/.iat/.at的索引器将设置为.loc/.ix/.iloc/.iat/.at

  • 获取单个dtyped对象的索引器几乎总是一个视图(取决于内存布局,它可能不是这就是为什么这是不可靠的)。 这主要是为了效率。 (从上面的例子是.query ;这将始终返回一个副本,因为它的计算由numexpr

  • 获取多个dtype对象的索引器始终是副本。

chained indexing例子

 df[df.C <= df.B].ix[:,'B':'E'] 

不保证工作(因此你永远不要这样做)。

相反:

 df.ix[df.C <= df.B, 'B':'E'] 

因为这是更快 ,并将始终工作

链接索引是2个独立的python操作,因此不能被大pandas可靠地拦截(你经常会得到一个SettingWithCopyWarning ,但是这也不是100%可检测的)。 你指出的开发文档提供了更完整的解释。