日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决 pandas 读取数据时内存过大的问题

發布時間:2024/10/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决 pandas 读取数据时内存过大的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解決 pandas 讀取數據時內存過大的問題

背景:

在我們使用pandas進行數據處理的時候,有時候發現文件在本地明明不大,但是用pandas以DataFrame形式加載內存中的時候會占用非常高的內存,這是因為pandas的處理機制默認會按照最大的規格去設置數據類型。

數據類型占用內存表格

  • 常用的數據類型范圍如下所示:

    dtypes 范圍下限(含) 范圍上限(含) unit8 0 255 unit16 0 65535 int8 -128 127 int16 -32768 32767 int32 -2147483648 2147483647 int64 –9,223,372,036,854,775,808 9,223,372,036,854,775,807

案例展示:

  • 制造數據:

    data = {'player1':[70,75,60,68]}data = pd.DataFrame(data) dataplayer10 701 752 603 68
  • 輸出數據和他的數據類型:

    for i in data['player1'].values:print(type(i))<class 'numpy.int64'> <class 'numpy.int64'> <class 'numpy.int64'> <class 'numpy.int64'>

解決方法:

def reduce_mem_usage(df, verbose=True):numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']# 計算當前占用的內存 start_mem = df.memory_usage(deep=True).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()# 如果 該列的數據類型屬于 int 類型,然后進行判斷if str(col_type)[:3] == 'int':# 如果 該列最小的值 大于int8類型的最小值,并且最大值小于int8類型的最大值,則采用int8類型 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)# 否則 則采用 float 的處理方法 else:if 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(deep=True).sum() / 1024**2if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))return df

總結

以上是生活随笔為你收集整理的解决 pandas 读取数据时内存过大的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。