我有大约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使用一个函数。有没有办法优化这个?
答案 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