我有一个数据框,并希望每次都能处理一个小分区,用于'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。我怎样才能进一步提高?
'a', 'b','c'
中不同值的总笛卡尔积。不会groupby
对我的元组中不存在的索引进行过多的工作吗?
答案 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。