pandas学习笔记之内存优化

函数

在处理大型数据集的时候,经常碰见python把内存吃满的情况,影响性能,此时就可以对数据集在内存中的存储方式进行优化。所用函数如下:

pandas.DataFrame.memory_usage(index=True, deep=False)
返回该数据框所用的字节数(bytes)
index参数控制索引占用字节是否出现在结果中。
deep参数返回object对象在系统层面(不是很懂)的存储消耗。

pandas.to_numeric(arg, errors=‘raise’, downcast=None)
arg参数传入数据。
error参数控制无效解析返回方式。
downcast参数选择压缩的数据类型,包含‘integer’, ‘signed’, ‘unsigned’, ‘float’四种类型。

实例

import pandas as pd
import numpy as np
df = pd.read_csv('/newstart/data/train.csv')
df.info()

载入泰坦尼克数据集,返回以下结果:在这里插入图片描述
dtype返回数据类型,发现有三种类型分别是int64,object,float64,那么可以将其压缩为int8,category,和float32。看看目前的内存消耗,总共占约83.7KB。以下为各列所耗字节数:

df.memory_usage()

Index           128
PassengerId    7128
Survived       7128
Pclass         7128
Name           7128
Sex            7128
Age            7128
SibSp          7128
Parch          7128
Ticket         7128
Fare           7128
Cabin          7128
Embarked       7128
dtype: int64

定义内存压缩函数:

def downcast(df):
    start_memory = df.memory_usage().sum() #返回一开始的使用内存
    for column in df.columns:              #循环所有列变量
        dtype_name = df[column].dtype.name #获取变量类型
        if dtype_name == 'object':
            pass                           #由于这里有姓名和船票,不方便直接转为分类变量
            #df[column] = df[column].astype('category') #像Embarked就可以转为分类变量压缩
        elif dtype_name == 'bool':                      #如果有布尔值可以转换为0,1压缩
            df[column] = df[column].astype('int8')
        elif dtype_name.startswith('int') or (df[column].round() == df[column]).all():
            df[column] = pd.to_numeric(df[column], downcast='integer')  #压缩整数列,这里年龄是浮点数也可以换成整数存储
        else:
            df[column] = pd.to_numeric(df[column], downcast='float')  #压缩浮点数
    end_memory = df.memory_usage().sum()  #返回压缩后的使用内存
    print('{:.1f}% compressed'.format(100 * (start_memory - end_memory) / start_memory))
    #返回压缩比
    return df
downcast(df)

返回结果:
43.7% compressed。和原来相比压缩近一半的存储空间。
在这里插入图片描述
对比上面可以发现int型数据从7128字节压缩到了891字节,也就是从int64转换为了int8,巨大提升。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值