pandas利用数据类型转换节省内存空间

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]

你可能感兴趣的:(python,pandas,numpy)