当前位置: 首页 > 知识库问答 >
问题:

如何在pandas中查询多索引的索引列值

颜云瀚
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 

现在,我要检索一个值:
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]中有重复,作为范围中的数据行数-预期返回值:[111,222,222,333,333]

更正式:

让我们假设T是一个有a、B和C列的表,表包括n行。表格单元格是数字,例如A double、B和C整数。让我们创建一个表T的数据帧,命名为DF。让我们设置DF的A和B列索引(没有重复,即没有单独的A和B列作为索引,单独作为数据),即A和B在本例中为multiindex。

问题:

    null

对于不是索引的列,我知道上面问题的答案,但是对于索引,经过在web上的长期研究和pandas功能的实验,我没有成功。我现在看到的唯一方法(不需要额外编程)是除了索引之外,还有一个a和B的副本作为数据列。

共有1个答案

琴正初
2023-03-14

通过多索引值查询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
 类似资料:
  • 有两个问题看起来很相似,但它们不是同一个问题:这里和这里。它们都调用的方法,例如或,我知道这会返回一个。我要问的是如何将(class)对象本身转换为。我将在下面举例说明。 构建一个示例,如下所示。 上面的应该如下所示(显然有不同的数字)。 我想做的是按列名称和采取分组(按此顺序),这样我就可以得到一个由列名称和采取构建的多索引索引,如下所示。 我如何实现这一点?如果我做了,那么是一个实例。正确的做

  • 问题内容: 我在MySQL数据库中有下表: SQL将如下所示: 如您所见,我同时创建了primaryId和和imgDate索引键。我的想法是,该WHERE子句使用primaryId,而ORDER子句使用来查询结果imgDate。 我的问题是,现在使用多索引会更好吗?还是我应该使用多列索引(目前我不太了解)? 这是我从EXPLAIN得到的: 注意:这不是使用多列索引,这是使用上表说明的结果。 问题答

  • 问题内容: 我有以下pd.DataFrame: 它具有带有和层次结构级别的MultiIndex列。该标签从0到n,并为每个标签,有两个和列。 我想子选择此DataFrame的所有(或)列。 问题答案: 有一种方法可以与布尔索引一起使用,以获得预期的结果。

  • 如果我定义一个像这样的分层索引数据框: 内容如下所示: 我知道如何提取与给定列对应的数据。例如。对于列: 如何提取符合以下标准集的数据: , , , column , , 列 和 、、列、以及从开始的所有列 是偶数 (顺便说一句,我做了不止一次rtfm,但我真的觉得难以理解。)

  • 问题内容: 代码示例: 现在,我要检索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 :在

  • 问题内容: 这是查询: 现在,如果我在字段上添加了带有多列的索引: MySQL将利用此多列索引吗?还是不使用它,因为一个字段位于where子句中,而另一个字段位于order语句中?还是只要我按多列索引的顺序使用字段就没关系吗? 问题答案: 好问题。 索引从左到右起作用,因此您的条件将使用索引。在这种情况下,排序也将利用索引(下面的执行计划)。 从手册: 即使索引与索引不完全匹配,也可以使用索引,只