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