我们可以用函数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%内存消耗的小贴士