在pandas数据框中高效地进行特征降维

4
我有一个包含约20万个样本的大数据集。每个样本都有一组大约10个特征,这些特征来自大约10万个可能的特征集合,并带有一些浮点型的测量值。
例如,在给定的数据集中:
Features                  trial             observations
{1, 40020, 8222}          4                 2
{1, 40020, 22, 16000}     14                8
{1, 20, 22, 1000}         1                 0
{42, 22, 16000}           2                 1

所以我需要一个函数f,满足以下条件:
f(data, {1, 40020})=

Features                  trial             observations
{1, 40020}                18                10
{1}                       1                 0
{}                        2                 1

f(data, {22, 40020})=

Features                  trial             observations
{40020}                   4                 2
{40020, 22}               14                8
{22}                      3                 1

因此,函数f通过将特征列与给定集合相交并对聚合列求和来对数据进行分组。

考虑到我需要针对许多不同的特征集合作为第二个参数调用“f”,因此任何可以预处理以加速每个调用的操作可能都是有益的。

我找到的最快方法是

pandas.DataFrame([sample.data for sample in samples], index=[sample.features for sample in samples]).groupby(lambda x: x & test_features, sort=False).sum()

但性能还不够好。我猜这是因为我在使用groupby函数。有没有一种优化这个过程的方法?


请提供更完整的示例以及pandas版本。 - Jeff
我更改了示例以使其更明确,请告诉我现在是否清楚。 - idanzalz
在分组之前先尝试进行选择,像这样:df.loc[:,df['features'].isin(set_of_features)].groupby(df['Features']).sum();速度应该会更快。 - Jeff
1个回答

1
你可以尝试使用frozenset准备你的分组数据,而不是set,因为frozenset是可哈希的。
首先将Features列从set转换为frozenset
df['Features'] = df['Features'].apply(frozenset)

然后这会给出你需要对数据进行分组的交集:
df['Features'] & frozenset({1, 40020})
Out[64]: 
0    (1, 40020)
1    (1, 40020)
2           (1)
3            ()

最终你会得到数据框的结果:
df.groupby(df['Features'] & frozenset({1, 40020}), sort=False).sum()
Out[65]: 
            trial  observations
Features                       
(1, 40020)     18            10
(1)             1             0
()              2             1

谢谢,这实际上是一个不错的性能改进。我想知道是否有任何方法通过对表进行任何类型的预处理来进一步加快该过程的速度。 - idanzalz
如果所有集合的并集长度较小,您可以为每个值创建一个布尔列,并使用这些列进行过滤。 - Zeugma
由于集合中的元素总数约为100K,这种方法对我来说不起作用。我希望可能有一种更稀疏的实现方法。 - idanzalz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接