我有一个数据帧,并且希望每次都在一个小分区上处理值为'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)})

所以我选择使用熊猫多索引:
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不会对我的元组中不存在的索引做多余的工作量吗?

最佳答案

怎么样:

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

结果是没有索引的ndarray。

08-19 11:36