我发誓我前段时间在某处看到过这个讨论,但我再也找不到这个了。
想象一下我有这个方法:
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/