2017-04-21 39 views
0

我想將熊貓數據幀df_old重命名爲df_new如何以內存有效的方式重命名熊貓數據框(無需創建副本)?

由於df.rename只似乎是專爲單系列/給定的數據幀中的列,我用在當下以下方法:

df_new = df_old 
del df_old 

然而,這是不是內存使用效率可言,因爲它創建df_old的副本。

如何以更高效的內存方式重命名熊貓數據框,類似於inplace = True

+3

是什麼讓你認爲它創造了一個副本? –

+1

[另請參閱](https://nedbatchelder.com/text/names.html)。 –

+1

它不創建副本(它們指向同一個對象),它不是一個真正的熊貓問題。 – ayhan

回答

2

正確答案的問題:

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

newName = oldName 已經是重命名

讓我們給的總結內存高效的方式什麼先遵循:

內存需求沒有顯著變化由於df_new = df_old

有一個很好的ressource解釋這一切HERE說服力:

Python的內存管理是如此重要,它的行爲,不僅你不需要刪除值,但是沒有辦法刪除值。您可能已經看到del語句:

nums = [1, 2, 3] 
del nums 

這不會刪除值NUMS,它將刪除名稱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兆字節的存儲空間。