大熊猫数据帧中的高效功能减少

时间:2013-10-13 05:36:17

标签: python pandas

我有大约200K样本的大数据集。每个样本都有一组来自各种约100K可能特征的特征(大约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使用一个函数。有没有办法优化这个?

1 个答案:

答案 0 :(得分: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