python數(shù)據(jù)分析之DataFrame內(nèi)存優(yōu)化
💃今天看案例的時(shí)候看見(jiàn)了一個(gè)關(guān)于pandas數(shù)據(jù)的內(nèi)存壓縮功能,特地來(lái)記錄一下。
🎒先說(shuō)明一下情況,pandas處理幾百兆的dataframe是沒(méi)有問(wèn)題的,但是我們?cè)谔幚韼讉€(gè)G甚至更大的數(shù)據(jù)時(shí),就會(huì)特別占用內(nèi)存,對(duì)內(nèi)存小的用戶特別不好,所以對(duì)數(shù)據(jù)進(jìn)行壓縮是很有必要的。
1. pandas查看數(shù)據(jù)占用大小
給大家看一下這么查看自己的內(nèi)存大小(user_log是dataframe的名字)
#方法1 就是使用查看dataframe信息的命令
user_log.info()
#方法2 使用memory_usage()或者getsizeof(user_log)
import time
import sys
print('all_data占據(jù)內(nèi)存約: {:.2f} GB'.format(user_log.memory_usage().sum()/ (1024**3)))
print('all_data占據(jù)內(nèi)存約: {:.2f} GB'.format(sys.getsizeof(user_log)/(1024**3)))
我這里有個(gè)dataframe文件叫做user_log,原始大小為1.91G,然后pandas讀取出來(lái),內(nèi)存使用了2.9G。
看一下原始數(shù)據(jù)大小:1.91G

pandas讀取后的內(nèi)存消耗:2.9G

2. 對(duì)數(shù)據(jù)進(jìn)行壓縮
- 數(shù)值類型的列進(jìn)行降級(jí)處理(‘int16', ‘int32', ‘int64', ‘float16', ‘float32', ‘float64')
- 字符串類型的列轉(zhuǎn)化為類別類型(category)
- 字符串類型的列的類別數(shù)超過(guò)總行數(shù)的一半時(shí),建議使用object類型
我們這里主要采用對(duì)數(shù)值型類型的數(shù)據(jù)進(jìn)行降級(jí),說(shuō)一下降級(jí)是什么意思意思呢,可以比喻為一個(gè)一個(gè)抽屜,你有一個(gè)大抽屜,但是你只裝了鑰匙,這就會(huì)有很多空間浪費(fèi)掉,如果我們將鑰匙放到一個(gè)小抽屜里,就可以節(jié)省很多空間,就像字符的類型int32 比int8占用空間大很多,但是我們的數(shù)據(jù)使用int8類型就夠了,這就導(dǎo)致數(shù)據(jù)占用了很多空間,我們要做的就是進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,節(jié)省內(nèi)存空間。
壓縮數(shù)值的這段代碼是從天池大賽的某個(gè)項(xiàng)目中看見(jiàn)的,查閱資料后發(fā)現(xiàn),大家壓縮內(nèi)存都是基本固定的函數(shù)形式
def reduce_mem_usage(df):
starttime = time.time()
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
start_mem = df.memory_usage().sum() / 1024**2
for col in df.columns:
col_type = df[col].dtypes
if col_type in numerics:
c_min = df[col].min()
c_max = df[col].max()
if pd.isnull(c_min) or pd.isnull(c_max):
continue
if str(col_type)[:3] == 'int':
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32)
elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64)
else:
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16)
elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
df[col] = df[col].astype(np.float32)
else:
df[col] = df[col].astype(np.float64)
end_mem = df.memory_usage().sum() / 1024**2
print('-- Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction),time spend:{:2.2f} min'.format(end_mem,
100*(start_mem-end_mem)/start_mem,
(time.time()-starttime)/60))
return df
用壓縮的方式將數(shù)據(jù)導(dǎo)入user_log2中
#首先讀取到csv中如何傳入函數(shù)生稱新的csv user_log2=reduce_mem_usage(pd.read_csv(r'/Users/liucong/MainFiles/ML/tianchi/tianmiao/user_log_format1.csv'))
讀取成功:內(nèi)訓(xùn)大小為890.48m 減少了69.6%,效果顯著

查看壓縮后的數(shù)據(jù)集信息:類型發(fā)生了變化,數(shù)量變小了

3. 參考資料
《天池大賽》
《kaggle大賽》
鏈接: pandas處理datafarme節(jié)約內(nèi)存.
到此這篇關(guān)于python數(shù)據(jù)分析之DataFrame內(nèi)存優(yōu)化的文章就介紹到這了,更多相關(guān)python DataFrame內(nèi)存優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python?DataFrame中stack()方法、unstack()方法和pivot()方法淺析
- python?pandas分割DataFrame中的字符串及元組的方法實(shí)現(xiàn)
- python?DataFrame數(shù)據(jù)分組統(tǒng)計(jì)groupby()函數(shù)的使用
- python DataFrame數(shù)據(jù)格式化(設(shè)置小數(shù)位數(shù),百分比,千分位分隔符)
- python用dataframe將csv中的0值數(shù)據(jù)轉(zhuǎn)化為nan缺失值字樣
- python中Array和DataFrame相互轉(zhuǎn)換的實(shí)例講解
- python將Dataframe格式的數(shù)據(jù)寫(xiě)入opengauss數(shù)據(jù)庫(kù)并查詢
相關(guān)文章
Django項(xiàng)目的創(chuàng)建全過(guò)程
本文介紹了如何在Windows系統(tǒng)上安裝和配置Python解釋器、切換默認(rèn)版本、使用虛擬環(huán)境安裝Django,并通過(guò)PyCharm創(chuàng)建和管理Django項(xiàng)目2025-01-01
python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例
下面小編就為大家分享一篇python3獲取當(dāng)前文件的上一級(jí)目錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python+selenium+autoit實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了python+selenium+autoit實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下2017-08-08
pygame外星人入侵小游戲超詳細(xì)開(kāi)發(fā)流程
這篇文章主要介紹了利用Python編寫(xiě)的外星人入侵游戲的示例代碼,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-03-03
Flask框架利用Echarts實(shí)現(xiàn)繪制圖形
echarts是百度推出的一款開(kāi)源的基于JavaScript的可視化圖表庫(kù),該開(kāi)發(fā)庫(kù)目前發(fā)展非常不錯(cuò),且支持各類圖形的繪制可定制程度高。如下演示案例中,將分別展示運(yùn)用該繪圖庫(kù)如何前后端交互繪制(餅狀圖,柱狀圖,折線圖)這三種最基本的圖形,需要的可以參考一下2022-10-10
Python3用tkinter和PIL實(shí)現(xiàn)看圖工具
這篇文章給大家分享了Python3用tkinter和PIL實(shí)現(xiàn)看圖工具的詳細(xì)實(shí)例代碼,有興趣的朋友參考學(xué)習(xí)下。2018-06-06
解決nohup重定向python輸出到文件不成功的問(wèn)題
今天小編就為大家分享一篇解決nohup重定向python輸出到文件不成功的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
解決python flask中config配置管理的問(wèn)題
今天小編就為大家分享一篇解決python flask中config配置管理的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

