当前位置: 首页 > 面试题库 >

pandas使用什么规则生成视图与副本?

习海
2023-03-14
问题内容

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

才不是。

是否有一个熊猫正在使用的简单规则,我只是想念它?在这些特定情况下发生了什么?尤其是,如何更改满足特定查询的数据框中的所有值(或值的子集)(就像我在上面的最后一个示例中尝试的那样)?

注意:这和这个问题不一样;并且我已经阅读了文档,但并未对此有所启发。我还阅读了有关此主题的“相关”问题,但我仍然缺少Pandas使用的简单规则,以及如何将其应用于(例如)修改值(或值的子集)在满足特定查询的数据框中。


问题答案:

这是规则,后续优先事项:

  • 所有操作都会生成一个副本

  • 如果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操作,因此无法被熊猫可靠地拦截(您通常会得到SettingWithCopyWarning,但也不是100%可检测到的)。您所指出的dev文档提供了更全面的说明。



 类似资料:
  • 视图是指对数据的引用,通过该引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。 视图一般发生在: Numpy 的切片操作返回原数据的视图; 调用 ndarray 的 view() 函数产生一个视图。 副本一般发生在: 在对 Pytho

  • TraceId 生成规则 SOFATracer 通过 TraceId 来将一个请求在各个服务器上的调用日志串联起来,TraceId 一般由接收请求经过的第一个服务器产生,产生规则是: 服务器 IP + 产生 ID 时候的时间 + 自增序列 + 当前进程号 ,比如: 0ad1348f1403169275002100356696 前 8 位 0ad1348f 即产生 TraceId 的机器的 IP,

  • 我们知道,3以上的所有素数都可以通过以下方法生成: 然而,由上述公式生成的所有数字都不是素数。 为了消除这种情况,我使用了筛法,并删除了数字,这些数字是由上述公式生成的数字的因子。 利用事实: 如果一个数没有质因数,它就被称为质因数。 因为我们可以使用上述公式生成所有素数 如果我们能去掉以上数字的所有倍数,我们只剩下质数 生成低于1000的素数。 然而,这种方法确实正确生成质数。这运行得更快,因为

  • 使用指南 - 统计设置 - 统计规则设置 - 什么是统计规则 统计规则指对网站流量数据的分类或者过滤方法。如果您对获取的流量数据有特殊需求,一般可以通过设置统计规则的方式来实现。 例如,如果您希望获取的流量数据中不包含公司内部访问的流量,那么您可以通过排除IP的方式实现;如果您希望按照实际业务内容划分流量数据,那么您可以通过新增子目录的方式实现。

  • 我正在使用drools fusion,我想根据实现的规则数测试这个cep系统的性能。现在,我有了一个简单的规则文件。drl扩展。我想动态生成大约1000条规则。那么,如何在不让他们在中创建一对一的情况下自动完成此操作呢。drl文件?

  • 问题内容: 例如,尝试理解以下结果: 这里发生了什么?在[1]的情况下,它将1与x的每个元素进行比较,并将结果汇​​总到一个数组中。对于[[1]],同样的事情。仅通过对repl进行试验,就很容易弄清楚特定阵列形状会发生什么。但是,双方可以具有任意形状的基本规则是什么? 问题答案: NumPy会在比较之前尝试将两个数组广播为兼容形状。如果广播失败,则当前返回False。将来, 如果广播或元素比较等失