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

ca1c2owp  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(147)

我对Pandas在决定从数据框中选择的内容是原始数据框的副本还是原始数据框上的视图时使用的规则感到困惑。
如果我有,例如,

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

将不会对原始 Dataframe 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']

并没有。
有没有一个简单的规则,Pandas是使用,我只是失踪?在这些具体案例中发生了什么;特别是,我如何更改 Dataframe 中满足特定查询的所有值(或值的子集)(就像我在上面的最后一个例子中尝试做的那样)?
注意:这与this question不同;我已经阅读了文档,但并没有从中得到启发。我也阅读了关于这个主题的“相关”问题,但我仍然缺少Pandas正在使用的简单规则,以及我如何将其应用于-例如-修改满足特定查询的 Dataframe 中的值(或值的子集)。

btqmn9zl

btqmn9zl1#

以下是规则,随后覆盖:

  • 所有操作都会生成一个副本
  • 如果提供了inplace=True,则就地修改;只有某些操作支持此操作
  • 一种索引器,用于设置,例如.loc/.iloc/.iat/.at将设置到位。
  • 在单数据类型对象上的索引器几乎总是一个视图(取决于内存布局,它可能不是,这就是为什么这是不可靠的)。这主要是为了效率。(上面的例子是.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%可检测的)。你指出的开发文档提供了一个更完整的解释。

hzbexzde

hzbexzde2#

这里有一些有趣的事情:

u = df
v = df.loc[:, :]
w = df.iloc[:,:]
z = df.iloc[0:, ]

前三个似乎都是df的引用,但最后一个不是!

相关问题