Python 一种快速删除熊猫中未使用类别的方法?

Python 一种快速删除熊猫中未使用类别的方法?,python,pandas,categorical-data,Python,Pandas,Categorical Data,我正在用Python运行一些模型,其中包含关于类别的数据子集 对于内存使用和预处理,所有分类变量都存储为类别数据类型 对于“分组依据”列中分类变量的每个级别,我正在运行一个回归,其中我需要将所有分类变量重置为该子集中存在的变量 我目前正在使用.cat.remove_unused_categories(),这占了我总运行时间的近50%。目前,最严重的问题是我的分组专栏,其他人没有花那么多时间(因为我猜没有那么多的级别需要降低) 以下是一个简化的示例: import itertools import

我正在用Python运行一些模型,其中包含关于类别的数据子集

对于内存使用和预处理,所有分类变量都存储为类别数据类型

对于“分组依据”列中分类变量的每个级别,我正在运行一个回归,其中我需要将所有分类变量重置为该子集中存在的变量

我目前正在使用
.cat.remove_unused_categories()
,这占了我总运行时间的近50%。目前,最严重的问题是我的分组专栏,其他人没有花那么多时间(因为我猜没有那么多的级别需要降低)

以下是一个简化的示例:

import itertools
import pandas as pd
#generate some fake data
alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
keywords = [''.join(i) for i in itertools.product(alphabets, repeat = 2)]
z = pd.DataFrame({'x':keywords})

#convert to category datatype
z.x = z.x.astype('category')

#groupby
z = z.groupby('x')

#loop over groups
for i in z.groups:
    x = z.get_group(i)
    x.x = x.x.cat.remove_unused_categories()
    #run my fancy model here
在我的笔记本电脑上,这大约需要20秒。对于这个小例子,我们可以转换为str,然后返回到category以提高速度,但我的真实数据每个组至少有300行


有可能加速这个循环吗?我试过使用
x.x=x.x.cat.set_categories(I)
,这需要相似的时间,而
x.x.cat.categories=I
,它要求与我开始时相同数量的类别。

您的问题在于您正在将
z.get_group(I)
分配给
x
x
现在是
z
的一部分的副本。您的代码将与此更改一起正常工作

for i in z.groups:
    x = z.get_group(i).copy() # will no longer be tied to z
    x.x = x.x.cat.remove_unused_categories()

但它仍然会从父DF复制所有类别-你认为它会快得多吗?我不知道OP在做什么!所以我必须信任他们,在这里运行我的花式模型。我运行了这段代码,速度非常慢,因为它正在输出带有复制警告的设置。我更改了那行代码,很快就完成了。现在我已经运行了它,这肯定是我的原始代码的问题。非常感谢-如果我们在数据构造中将
repeat=2
增加到3,您可以看到问题仍然存在,但是这已经从运行时的.5减少到了0.05。带有复制警告的设置不是误报;此外,他们可能会进行垃圾收集(这可能会很昂贵)以查找引用。您可以尝试以下操作:
x=z.get_组(i).astype({'x':'str'}).astype({'x':'category'})
并删除此行:
x.x=x.x.cat.删除未使用的_类别()
?有趣的是,它是否会更快…这加快了示例的速度,但我的实际数据每个组有3-400行,在这种情况下,字符串转换会更慢。