加快大熊猫多级指标选择的方法?

时间:2014-02-26 16:08:49

标签: python numpy pandas

我有一个数据框,并希望每次都能处理一个小分区,用于'a', 'b','c'的特定元组。

df = pd.DataFrame({'a':np.random.randint(0,10,10000),
                   'b':np.random.randint(0,10,10000),
                   'c':np.random.randint(0,10,10000),
                   'value':np.random.randint(0,100,10000)})

所以我选择使用pandas multiindex:

dfi = df.set_index(['a','b','c'])
dfi.sortlevel(inplace = True)

然而,表现并不好。

%timeit dfi.ix[(2,1,7)] # 511 us
%timeit df[(df['a'].values == 2) & 
           (df['b'].values == 1) & (df['c'].values == 7)] # 247 us

我怀疑某处有一些开销。我的程序有~1k元组,所以一次运行需要511 * 1000 = 0.5s。我怎样才能进一步提高?

更新

嗯,我忘了提到元组的数量小于df中'a', 'b','c'中不同值的总笛卡尔积。不会groupby对我的元组中不存在的索引进行过多的工作吗?

2 个答案:

答案 0 :(得分:4)

尚不清楚“工作”的意思,但我会这样做

这几乎可以是任何功能

In [33]: %timeit df.groupby(['a','b','c']).apply(lambda x: x.sum())
10 loops, best of 3: 83.6 ms per loop

某些操作非常快速地进行了cython化

In [34]: %timeit df.groupby(['a','b','c']).sum()
100 loops, best of 3: 2.65 ms per loop

对多索引进行选择无法按索引进行索引。

如果您在总组中的一小部分上运行,那么您可能希望直接索引到多索引;如果你在一小部分(或许20%)的小组或更多小组上进行操作,groupby会获胜。您可能还需要调查filter,您可以根据某些条件对这些组进行预过滤。

如上所述,群体索引者的笛卡尔积是无关紧要的。只有实际的组将由groupby迭代(将MultiIndex视为总可能空间的稀疏表示)。

答案 1 :(得分:2)

怎么样:

dfi = df.set_index(['a','b','c'])
dfi.sortlevel(inplace = True)
value = dfi["value"].values
value[dfi.index.get_loc((2, 1, 7))]

结果是没有索引的ndarray。