繁体   English   中英

如何以内存有效的方式重命名熊猫数据框(不创建副本)?

[英]How to rename a pandas dataframe in a memory-efficient way (without creating a copy)?

我想将熊猫数据df_old df_new重命名为df_new

由于df.rename似乎只为给定数据帧内的单个系列/列而设计,因此目前我使用以下方法:

df_new = df_old
del df_old

但是,由于创建了df_old的副本,因此这根本不提高内存效率。

如何以更节省内存的方式重命名pandas数据帧,类似于inplace = True

这个问题的正确答案:

"How to rename a pandas dataframe in a more memory-efficient way, similar to inplace = True?" 是:

newName = oldName 已经是一种内存有效的重命名方法

让我们总结一下以下内容:

由于df_new = df_old ,因此内存需求没有明显变化

有一个很好的ressource解释这一切这里讲:

Python的内存管理对其行为如此重要,不仅您不必删除值,而且无法删除值。 您可能已经看到了del语句:

nums = [1, 2, 3]
del nums

这不会删除数值num,而是删除名称nums。 该名称从其作用域中删除,然后进行常规引用计数:如果nums的值只有一个引用,则将回收该值。 但是,如果它有其他引用,则不会。

以下所有大量内容仅是为了提供上述证明。


请参阅此代码:

from memory_profiler import profile

@profile(precision=4)
def my_func(): 
    import pandas

    df_old = pandas.DataFrame([1,2,3,4,5])
    print(df_old)
    print(id(df_old))
    df_new = df_old
    print(id(df_new), id(df_old))
    del df_old

my_func()

在我的盒子上可以看到:

>python3.6 -u "renamePandas_Cg.py"
   0
0  1
1  2
2  3
3  4
4  5
140482968978768
140482968978768 140482968978768
Filename: renamePandas_Cg.py

Line #    Mem usage    Increment   Line Contents
================================================
     3  31.1680 MiB   0.0000 MiB   @profile(precision=4)
     4                             def my_func(): 
     5  64.1250 MiB  32.9570 MiB       import pandas
     6                                 
     7  64.1953 MiB   0.0703 MiB       df_old = pandas.DataFrame([1,2,3,4,5])
     8  64.6680 MiB   0.4727 MiB       print(df_old)
     9  64.6680 MiB   0.0000 MiB       print(id(df_old))
    10  64.6680 MiB   0.0000 MiB       df_new = df_old
    11  64.6680 MiB   0.0000 MiB       print(id(df_new), id(df_old))
    12  64.6680 MiB   0.0000 MiB       del df_old

事实证明,注释中所说的实际上是事实,因为df_old和df_new都指向内存中的相同地址,并且由于df_new = df_old在内存中没有增加

让我们看看是否显示内存增加仅仅是因为精度太低。 在这里,presision的结果= 7:

>python3.6 -u "renamePandas_Cg.py"
   0
0  1
1  2
2  3
3  4
4  5
140698387071216
140698387071216 140698387071216
Filename: renamePandas_Cg.py

Line #    Mem usage    Increment   Line Contents
================================================
     3  31.1718750 MiB   0.0000000 MiB   @profile(precision=7)
     4                             def my_func(): 
     5  64.1992188 MiB  33.0273438 MiB       import pandas
     6                                 
     7  64.3125000 MiB   0.1132812 MiB       df_old = pandas.DataFrame([1,2,3,4,5])
     8  64.7226562 MiB   0.4101562 MiB       print(df_old)
     9  64.7226562 MiB   0.0000000 MiB       print(id(df_old))
    10  64.7226562 MiB   0.0000000 MiB       df_new = df_old
    11  64.7226562 MiB   0.0000000 MiB       print(id(df_new), id(df_old))
    12  64.7226562 MiB   0.0000000 MiB       del df_old

嗯...内存增加与以前不一样...并且从一次运行到另一次运行不一致。

顺便说一句,如果您仍然怀疑结果,因为数据帧太小, df_old = pandas.DataFrame([1,2,3,4,5])更改为df_old = pandas.DataFrame(100000*[1,2,3,4,5]) ,您将看到与以前相同的结果,除了语句df_old = pandas.DataFrame(100000*[1,2,3,4,5])占用了7 MB以上的内存空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM