【问题标题】:Pandas manipulating a DataFrame inplace vs not inplace (inplace=True vs False) [duplicate]熊猫就地或不就地操作DataFrame(就地=真或假)[重复]
【发布时间】:2018-04-25 00:41:21
【问题描述】:

我想知道当我们选择就地操作数据帧(与非就地相比)时,内存使用是否会显着减少。

我在 Stack Overflow 上进行了一些搜索,发现了这个 post,其中的答案指出,如果没有就地完成操作,则会返回数据帧的副本(我想这有点明显当有一个名为'inplace'的可选参数时:P)。

如果我不需要保留原始数据框,那么只修改数据框会是有益的(并且合乎逻辑的)对吗?

上下文:

当按数据框中的特定“列”排序时,我试图获取顶部元素。我想知道这两个中哪一个更有效:

就地:

df.sort('some_column', ascending=0, inplace=1)
top = df.iloc[0]

复制:

top = df.sort('some_column', ascending=0).iloc[0]

对于“复制”情况,即使我没有将副本分配给变量,它仍然会在排序时分配内存来制作副本,对吗?如果是这样,从内存中释放该副本需要多长时间?

提前感谢您的任何见解!

【问题讨论】:

  • 在 jupyter 中执行并通过 %%time 比较执行时间。或选择其他工具来衡量性能
  • 我更关心内存使用情况,所以我将尝试“python 内存分析器”。我忘记了那个模块......我只是想知道是否有人可以给我一个快速的概念性答案。
  • 如果您的问题得到解答,请accept an answer
  • 没有完全回答...

标签: python pandas memory


【解决方案1】:

一般来说,inplace=True 和返回显式副本之间没有区别 - 两种情况 都会创建一个副本。碰巧的是,在第一种情况下,副本中的数据被复制回原始的df 对象,因此不需要重新分配。

此外,请注意,从 v0.21 开始,df.sort 已被弃用,请改用 sort_values

【讨论】:

  • 哦,所以这两种方法都会在内存中创建一个副本,但是将就地标记为 True 只是将其写回原始 df?那么是否可以准确地说将 inplace 设置为 False 然后删除原始变量的引用以显式释放内存与将 inplace 设置为 True 本质上是一样的?
  • @Ellest 第一个问题是。我不明白你的第二个问题,因为这里没有分配/解除分配。
  • @COLDSPEED 如何在不为副本分配内存的情况下创建副本?在inplace=False 的情况下,由于变量仍将引用该数据框对象,因此不会从内存中释放原始副本吗?即,如果我们没有就地排序:df = DataFrame(...); df_sorted = df.sort(...,inplace=False) 我们剩下 df 和 df_sorted 都占用空间。但是,如果我们就地排序:df = DataFrame(...); df.sort(...,inplace=True),我们只剩下一个数据框。
  • @Ellest 在后一种情况下,额外的 df 被垃圾收集。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 2014-11-30
  • 2013-11-20
  • 2023-01-17
  • 2019-03-15
相关资源
最近更新 更多