我想將熊貓數據幀df_old
重命名爲df_new
。如何以內存有效的方式重命名熊貓數據框(無需創建副本)?
由於df.rename只似乎是專爲單系列/給定的數據幀中的列,我用在當下以下方法:
df_new = df_old
del df_old
然而,這是不是內存使用效率可言,因爲它創建df_old
的副本。
如何以更高效的內存方式重命名熊貓數據框,類似於inplace = True
?
我想將熊貓數據幀df_old
重命名爲df_new
。如何以內存有效的方式重命名熊貓數據框(無需創建副本)?
由於df.rename只似乎是專爲單系列/給定的數據幀中的列,我用在當下以下方法:
df_new = df_old
del df_old
然而,這是不是內存使用效率可言,因爲它創建df_old
的副本。
如何以更高效的內存方式重命名熊貓數據框,類似於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解釋這一切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兆字節的存儲空間。
是什麼讓你認爲它創造了一個副本? –
[另請參閱](https://nedbatchelder.com/text/names.html)。 –
它不創建副本(它們指向同一個對象),它不是一個真正的熊貓問題。 – ayhan