Python 使用类别进行计算
仍然可以使用分类数据类型进行计算吗 如果没有,我如何减少使用分类整数(包含10m+个条目的非常大的表,只有约500个唯一整数)的RAM使用量。所有计算必须作为一个数组进行Python 使用类别进行计算,python,pandas,Python,Pandas,仍然可以使用分类数据类型进行计算吗 如果没有,我如何减少使用分类整数(包含10m+个条目的非常大的表,只有约500个唯一整数)的RAM使用量。所有计算必须作为一个数组进行 df = pd.DataFrame({'a':[1,2,3,2,1,3,4,5,6,7], 'b':[1,2,3,2,1,3,4,5,6,7]}) df['a'] = df['a'].astype('category') df['a'] * df['b'] 在熊猫0.20.3中: Out
df = pd.DataFrame({'a':[1,2,3,2,1,3,4,5,6,7],
'b':[1,2,3,2,1,3,4,5,6,7]})
df['a'] = df['a'].astype('category')
df['a'] * df['b']
在熊猫0.20.3
中:
Out[23]:
0 1
1 4
2 9
3 4
4 1
5 9
6 16
7 25
8 36
9 49
dtype: int64
这在较新的pandas版本(例如v0.23.0
)中不再有效
我现在需要为新的pandas版本重构代码,但是有没有办法维护提供的减少RAM消耗类别?作为目前的解决办法,您可以使用以下方法之一:
请注意,这使您有责任小心溢出。您计划如何存储/输出计算结果?您是否需要将整个结果存储在内存中?这是否确实减少了RAM/内存的使用?我认为Category用一个在哈希表中查找的int来替换数据。或者数据的int类型和分类索引的精度/字节是分开的?我有很多步骤不断转换int->category,所以都是在RAM中完成的。但是最终的输出是一个csv文件(非常小)。当我用这个公式计算时,它减少了RAM的使用:
df['regression_value']=(df['k1']*df['var1'])+…+(df['k9']+df['var9']]/(something)
其中每列有10m行。@AH-我尝试了cat_type=CategoricalDtype(categories=df['a'].unique())df['a']=df['a'].astype(cat_type)
,但失败了,所以我想最好的办法是问对int有用的,我想我也可以对float做同样的事,谢谢。
TypeError: Series cannot perform the operation *
import numpy as np
df = pd.DataFrame({'a':[1,2,3,2,1,3,4,5,6,7],
'b':[1,2,3,2,1,3,4,5,6,7]})
df['a'] = df['a'].astype(np.int8)
df['b'] = df['b'].astype(np.int8)
>>> df['a'] * df['b']
0 1
1 4
2 9
3 4
4 1
5 9
6 16
7 25
8 36
9 49
dtype: int8