python - Pandas DataFrame 切片与副本 : which one is more memory friendly?

标签 python pandas dataframe

我发誓我前段时间在某处看到过这个讨论,但我再也找不到这个了。
想象一下我有这个方法:

def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df[df['val'] == 1]
自从我决定不这样做以来已经有一段时间了,因为该方法可能会返回一个 View (这不是确定的,取决于 pandas 想要做什么)而不是一个新的数据帧。
我读到的问题是,如果返回一个 View ,原始数据帧中的引用计数不会减少,因为即使我们只使用了一小部分数据,它仍在引用旧数据帧。
我被建议改为执行以下操作:
def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df.drop(df[df["val"] != 1].index)
在这种情况下,drop 方法只使用我们想要保留的数据创建一个新的数据帧,一旦该方法完成,原始数据帧中的引用计数将被设置为零,使其容易受到垃圾收集并最终释放内存。
总之,这将更加内存友好,并且还将确保该方法的结果是数据帧而不是数据帧的 View ,这会导致 settingOnCopyWarning我们都爱。
这仍然是真的吗?或者是我在某处误读了什么?我试图检查这是否对内存使用有一些好处,但考虑到我无法控制 gc 决定何时从内存中“删除”东西,只是要求它收集东西......我似乎从来没有任何结论性的结果。

最佳答案

如果你想避免 returning a view , 只需将 return 语句从 df[mask] 更改为至 df[mask].copy() .

关于python - Pandas DataFrame 切片与副本 : which one is more memory friendly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64583097/

相关文章:

python - 提取满足给定条件的单元格的列标签

python - Pandas 旋转一个列并填充另一个旋转的列

python - Django Python - 如何在一个 HTML 模板中显示来自不同表格的信息

python - 构建docker镜像时,应该在哪里 `make`编译代码?跑? CMD?

python - 如何在pandas数据框中添加互补间隔

python - 获取数据框中特定数据点的行和列标签

pandas - 我应该如何在分类列中插补 NaN 值?

python - 对列中的数据进行求和和计数

python - 三个字符串的最长公共(public)子序列

python - groupby.first() 和 groupby.head(1) 有什么区别?