代码示例:
In [171]: A = np.array([1.1, 1.1, 3.3, 3.3, 5.5, 6.6]) In [172]: B = np.array([111, 222, 222, 333, 333, 777]) In [173]: C = randint(10, 99, 6) In [174]: df = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C']) In [175]: df.set_index(['A', 'B'], inplace=True) In [176]: df Out[176]: C A B 1.1 111 20 222 31 3.3 222 24 333 65 5.5 333 22 6.6 777 74
现在,我要检索A值: Q1 :在[3.3,6.6]范围内- 预期的返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](如果包括最后一个值),以及[3.3,5.5] ]或[3.3、3.3、5.5](如果没有)。 Q2 :在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3]
与任何其他 MultiIndex 维度相同,例如B值: Q3 :在[111,500]范围内,具有重复项,作为范围内的数据行数-预期的返回值:[111,222,222,333,333]
更正式:
让我们假设T是具有A,B和C列的表。该表包括 n 行。表格单元格是数字,例如A double,B和C整数。让我们创建表T的 DataFrame ,将其命名为DF。让我们设置DF的A列和B列索引(不重复,即没有单独的A列和B列作为索引,而作为数据分开),即A和B,在这种情况下为 MultiIndex 。
问题:
在列不是索引的情况下,我知道上述问题的答案,但在索引的情况下,经过长时间的网络研究和对 熊猫 功能的实验,我没有成功。我现在看到的唯一方法(无需额外编程)是除索引外,还有重复的A和B作为数据列。
要通过 MultiIndex 值查询 df ,例如 (A > 1.7)和(B <666):
In [536]: result_df = df.loc[(df.index.get_level_values('A') > 1.7) & (df.index.get_level_values('B') < 666)] In [537]: result_df Out[537]: C A B 3.3 222 43 333 59 5.5 333 56
因此,如果仍然需要,例如获取 “ A” 索引值:
In [538]: result_df.index.get_level_values('A') Out[538]: Index([3.3, 3.3, 5.5], dtype=object)
问题在于,在大数据帧中, 按索引 选择的性能比排序的常规行选择差10%。并且在重复的工作中,循环不断,延迟累积。参见示例:
In [558]: df = store.select(STORE_EXTENT_BURSTS_DF_KEY) In [559]: len(df) Out[559]: 12857 In [560]: df.sort(inplace=True) In [561]: df_without_index = df.reset_index() In [562]: %timeit df.loc[(df.index.get_level_values('END_TIME') > 358200) & (df.index.get_level_values('START_TIME') < 361680)] 1000 loops, best of 3: 562 µs per loop In [563]: %timeit df_without_index[(df_without_index.END_TIME > 358200) & (df_without_index.START_TIME < 361680)] 1000 loops, best of 3: 507 µs per loop