python数据分析之DataFrame内存优化

作者:柳小葱 时间:2021-09-03 23:08:29 

💃今天看案例的时候看见了一个关于pandas数据的内存压缩功能,特地来记录一下。

🎒先说明一下情况,pandas处理几百兆的dataframe是没有问题的,但是我们在处理几个G甚至更大的数据时,就会特别占用内存,对内存小的用户特别不好,所以对数据进行压缩是很有必要的。

1. pandas查看数据占用大小

给大家看一下这么查看自己的内存大小(user_log是dataframe的名字)


#方法1 就是使用查看dataframe信息的命令
user_log.info()
#方法2 使用memory_usage()或者getsizeof(user_log)
import time
import sys
print('all_data占据内存约: {:.2f} GB'.format(user_log.memory_usage().sum()/ (1024**3)))
print('all_data占据内存约: {:.2f} GB'.format(sys.getsizeof(user_log)/(1024**3)))

我这里有个dataframe文件叫做user_log,原始大小为1.91G,然后pandas读取出来,内存使用了2.9G。

看一下原始数据大小:1.91G

python数据分析之DataFrame内存优化

pandas读取后的内存消耗:2.9G

python数据分析之DataFrame内存优化

2. 对数据进行压缩

  • 数值类型的列进行降级处理(‘int16', ‘int32', ‘int64', ‘float16', ‘float32', ‘float64')

  • 字符串类型的列转化为类别类型(category)

  • 字符串类型的列的类别数超过总行数的一半时,建议使用object类型

我们这里主要采用对数值型类型的数据进行降级,说一下降级是什么意思意思呢,可以比喻为一个一个抽屉,你有一个大抽屉,但是你只装了钥匙,这就会有很多空间浪费掉,如果我们将钥匙放到一个小抽屉里,就可以节省很多空间,就像字符的类型int32 比int8占用空间大很多,但是我们的数据使用int8类型就够了,这就导致数据占用了很多空间,我们要做的就是进行数据类型转换,节省内存空间。

压缩数值的这段代码是从天池大赛的某个项目中看见的,查阅资料后发现,大家压缩内存都是基本固定的函数形式


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

用压缩的方式将数据导入user_log2中


#首先读取到csv中如何传入函数生称新的csv
user_log2=reduce_mem_usage(pd.read_csv(r'/Users/liucong/MainFiles/ML/tianchi/tianmiao/user_log_format1.csv'))

读取成功:内训大小为890.48m 减少了69.6%,效果显著

python数据分析之DataFrame内存优化

查看压缩后的数据集信息:类型发生了变化,数量变小了

python数据分析之DataFrame内存优化

3. 参考资料

《天池大赛》
《kaggle大赛》
链接: pandas处理datafarme节约内存.

来源:https://blog.csdn.net/weixin_48077303/article/details/118653717

标签:python,DataFrame,内存
0
投稿

猜你喜欢

  • Python中常用的字典键和值排的方法

    2022-12-22 15:51:05
  • Oracle性能究极优化 下

    2010-07-30 13:25:00
  • python 串行执行和并行执行实例

    2022-07-12 07:32:58
  • Oracle学习笔记(六)

    2012-01-05 18:55:27
  • JavaScript 编程引入命名空间

    2007-10-11 19:00:00
  • python 输出列表元素实例(以空格/逗号为分隔符)

    2023-10-03 16:40:52
  • python用faker库批量生成假数据

    2023-04-09 13:15:46
  • pygame实现方块动画实例讲解

    2022-11-01 13:37:46
  • DBA_2PC_PENDING 介绍

    2009-02-28 10:59:00
  • python中子类调用父类函数的方法示例

    2023-12-30 14:17:03
  • ASP读取ini文件

    2010-01-20 11:17:00
  • flask框架jinja2模板与模板继承实例分析

    2023-08-26 22:21:34
  • python 读写txt文件 json文件的实现方法

    2022-01-12 19:42:50
  • Python 绘图和可视化详细介绍

    2021-02-16 18:17:31
  • OBJECTPROPERTY与sp_rename更改对象名称的介绍

    2012-01-29 18:04:39
  • python利用正则表达式提取字符串

    2021-12-08 15:13:29
  • php文件类型MIME对照表(比较全)

    2023-06-08 07:24:10
  • Python多进程编程技术实例分析

    2022-07-23 18:02:49
  • python 图像平移和旋转的实例

    2021-03-06 23:59:49
  • 详解PyTorch中Tensor的高阶操作

    2021-11-24 12:08:00
  • asp之家 网络编程 m.aspxhome.com