pandas利用数据类型的转换(astype)节省内存空间
数据类型转换函数astype
df1 = pd.DataFrame({'a':[1,2,3,np.inf],'b':[12,321,23,np.nan]})
>>>
a b
0 1.0 12.0
1 2.0 321.0
2 3.0 23.0
3 0.0 NaN
#获取数据类型
df1.dtypes
>>>
a float64
b float64
dtype: object
#获取dataframe的大小(单位字节)
df1.memory_usage()
>>>
Index 80
a 32
b 32
dtype: int64
# 利用astype进行数据类型的压缩
df1 = df1.astype(np.float16)
df1.memory_usage()
>>>
Index 80
a 8
b 8
dtype: int64
df1
>>>
a b
0 1.0 12.0
1 2.0 321.0
2 3.0 23.0
3 0.0 NaN
可以看到,经过数据压缩之后,内存极大的降低了,对于数值型是如此,类别型也是如此,类别型的压缩则是转换为category类型 :df2 = df2.astype('category') ,具体的方法百度一下他人的博客。讲的很清楚,本文主要讲的是这里面的坑!
怎么自适应的转换
想要做到自适应的转换,首先需要知道某列的最大值和最小值,根据数据最大最小值的范围,依次与numpy的数据类型最大值最小值进行比较,选定最合适的数据类型,进行转换。
#获取某个类型最大值和最小值方法
np.iinfo(np.int8)
>>>
iinfo(min=-128, max=127, dtype=int8)
np.iinfo(np.int8).max
>>>
127
np.finfo(np.float16)
>>>
finfo(resolution=0.001, min=-6.55040e+04, max=6.55040e+04, dtype=float16)
np.finfo(np.float16).max
>>>
65500.0
坑:
对于数值型的转换
当数值型数据经过astype转换后,其相关指标的计算结果,也会与转换后的类型一致。
a = np.array([1,2,3,4])
a = a.astype(np.int8)
np.max(a).dtype
>>>
dtype('int8')
换句话说,如果只简单的最大值最小值计算还好,一定在范围之内,不会超出转换后的数据类型的范围,但是,在某些情况下,计算结果大大超过了数据类型的范围后,就会变成np.inf
当类别型数据经过astype,转换成category后,想要在进行缺失值的填补就会报错。
df = pd.DataFrame({'a':['a','b',np.nan]})
df['a'] = df['a'].astype('category')
df
>>>
a
0 a
1 b
2 NaN
df.fillna('c')
>>>
ValueError: fill value must be in categories
需要采用以下方式进行填补:
df['a'] = df['a'].cat.add_categories('asdasd')
df['a'].fillna('asdasd')
>>>
0 a
1 b
2 asdasd
Name: a, dtype: category
Categories (3, object): [a, b, asdasd]
网友评论