当前位置: 首页 > 面试题库 >

如何查询熊猫中的MultiIndex索引列值

章翔宇
2023-03-14
问题内容

代码示例:

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

问题:

  1. 如何在索引上写查询,例如,以标签间隔[120.0,540.0]来查询索引A(或B)?标签120.0和540.0存在。我必须澄清一下,我只对索引列表感兴趣,以此作为对查询的响应!
  2. 如果标签120.0和540.0不存在,但标签的值小于120,大于120和小于540或大于540,该怎么做?
  3. 如果Q1和Q2的答案是唯一的索引值,则现在是相同的,但具有重复性,即索引范围内的数据行数。

在列不是索引的情况下,我知道上述问题的答案,但在索引的情况下,经过长时间的网络研究和对 熊猫
功能的实验,我没有成功。我现在看到的唯一方法(无需额外编程)是除索引外,还有重复的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


 类似资料:
  • 现在,我要检索一个值: 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] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-

  • 问题内容: 我这样制作数据框。 我想通过使用一些熊猫方法将索引转换为此(例如set_index,stack 、、) 我怎样才能做到这一点? 问题答案: 我认为你需要与重塑,然后交换在水平由列由去年的排序列: 用另一种解决方案和:

  • 问题内容: 为什么在多索引DataFrame时不能使用偏移量? 例如,使用: 如果我尝试使用偏移量进行分组和滚动,则会显示“ ValueError:窗口必须为整数 ”: 并不是说以下这些变体可以满足我的需求,但是请注意对作品进行分组和滚动: 我可以在DataFrame的单索引子集上使用偏移量滚动: 如果确实不可能在多索引DataFrame上进行偏移滚动,那么将零应用于每个0级索引项的最有效的解决方

  • 问题内容: 我有一个类似MultiIndex的系列: 我想获得s [‘b’]值,其中第二个索引(’ ‘)在2到10之间。 在第一个索引上切片可以正常工作: 但不是第二种,至少从似乎是两种最明显的方式来看: 1)这将返回元素1至4,与索引值无关 但是,如果我反转索引,并且第一个索引是整数,第二个索引是字符串,则可以正常工作: 问题答案: 正如Robbie-Clarken回答的那样,从0.14开始,您

  • 问题内容: 不知道这里出了什么问题…我想要的只是本系列中的第一个也是唯一的元素 为什么这样不起作用?以及如何获得第一个元素? 问题答案: 当索引为整数时,您将无法使用位置索引器,因为选择将是模棱两可的(应基于标签还是位置返回?)。您需要明确使用 或传递标签。 由于索引类型是对象,因此可以进行以下操作: 但是对于整数索引,情况有所不同:

  • 如何在python熊猫中获得索引列名称?下面是一个示例数据框: 我想做的是获取/设置数据框索引标题。这是我所尝试的: 有人知道怎么做吗?