Pandas DataFrame 切片与副本:哪一个对内存更友好?

Jua*_*que 10 python dataframe pandas

我发誓我前段时间在某处看到过这个讨论,但我再也找不到这个了。

想象一下我有这个方法:

def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df[df['val'] == 1]
Run Code Online (Sandbox Code Playgroud)

自从我决定不这样做以来已经有一段时间了,因为该方法可能会返回一个视图(这不是确定的,取决于 pandas 想要做什么)而不是一个新的数据帧。

我读到的问题是,如果返回一个视图,原始数据帧中的引用计数不会减少,因为即使我们只使用了一小部分数据,它仍在引用旧数据帧。

我被建议改为执行以下操作:

def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df.drop(df[df["val"] != 1].index)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,drop 方法仅使用我们想要保留的数据创建一个新的数据帧,一旦该方法完成,原始数据帧中的引用计数将被设置为零,使其容易受到垃圾收集并最终释放内存。

总而言之,这将更加内存友好,并且还将确保该方法的结果是一个数据帧,而不是一个数据帧的视图,这会导致settingOnCopyWarning我们都喜欢。

这仍然是真的吗?或者是我在某处误读了什么?我试图检查这是否对内存使用有一些好处,但考虑到我无法控制 gc 何时决定从内存中“删除”东西,只是要求它收集东西......我似乎从来没有任何结论性的结果。

uke*_*emi 0

如果您想避免返回视图,只需将 return 语句从 更改df[mask]df[mask].copy()