您的位置:首页 > 其它

pandas 提高效率,降低内存的方法

2018-03-09 11:14 190 查看

将数值型列降级到更高效的类型

我们可以用函数pd.to_numeric()来对数值型进行向下类型转换。我们DataFrame.select_dtypes来只选择整型列,然后我们优化这种类型,并比较内存使用量。

先找到要转化的类型,可用以下语句:

DataFrame.select_dtypes(include=None, exclude=None)
#include, exclude : scalar or list-like
#返回DataFrame
data_2 = data.select_dtypes(include=['int8'])#'int8'要放在列表中,返回的data_2是DataFrame格式的


然后让这些数据自动转化成占内存较小的数据类型。

pandas.to_numeric(arg, errors='raise', downcast=None)

#arg : list, tuple, 1-d array, or Series
#errors : {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’}
#downcast : {‘integer’, ‘signed’, ‘unsigned’, ‘float’} , default None


将字符串列转换为类别类型

当我们把一列转换成category类型时,pandas会用一种最省空间的int子类型去表示这一列中所有的唯一值。

data['a'] = data['a'] .astype('category')


示例

import pandas as pd
data = pd.DataFrame({"a":[0,1, 2, 3, 4, 5, 6, 7, 8, 9], "b":["员工的编号","员工的编号","领导的编号","领导的编号","员工的编号","员工的编号","员工的编号","领导的编号","领导的编号","员工的编号"]})
print(data)
print(data.info())#显示数据类型和占用的内存
data['a'] = pd.to_numeric(data['a'], downcast='integer')
data['b'] = data['b'].astype('category')
print(data.info())#再次显示数据类型和占用的内存


结果:
a      b
0  0  员工的编号
1  1  员工的编号
2  2  领导的编号
3  3  领导的编号
4  4  员工的编号
5  5  员工的编号
6  6  员工的编号
7  7  领导的编号
8  8  领导的编号
9  9  员工的编号
_______________________________________我不是分割线————————————————————————————
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 2 columns):
a    10 non-null int64
b    10 non-null object
dtypes: int64(1), object(1)
memory usage: 240.0+ bytes
None
_______________________________________我不是分割线————————————————————————————
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 2 columns):
a    10 non-null int8
b    10 non-null category
dtypes: category(1), int8(1)
memory usage: 196.0 bytes
None


可见,它们的数据类型改变了,而且内存空间降低了,从240.0+ bytes => 196.0 bytes。看似内存降低的不多,只是这个示例比较简单,当处理的数据有几百兆时,有时可以使内存降低一半以上。

参考文章

用pandas处理大数据——节省90%内存消耗的小贴士
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: