代码示例:
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),比如标签区间[120.0,540.0]?存在标签120.0和540.0 . 我必须澄清,我只对索引列表感兴趣,作为对查询的响应!
-
如何相同,但如果标签120.0和540.0不存在,但有标签值低于120,高于120且低于540,或高于540?
-
如果Q1和Q2的答案是唯一索引值,现在相同,但重复,作为索引范围内的数据行数 .
我知道上述问题的答案是在不是索引的列的情况下,但在索引的情况下,经过长期的网络研究和对熊猫功能的实验,我没有成功 . 我现在看到的唯一方法(没有额外的编程)除了索引之外还有A和B的副本作为数据列 .
3 回答
For better readability ,我们可以简单地使用the query() Method,以避免冗长的
df.index.get_level_values()
和reset_index
/set_index
来回 .这是目标
DataFrame
:回答 Q1 (
A
,范围[3.3, 6.6]
):当然,任何人都可以使用
<, <=, >, >=
.同样,回答 Q2 (
A
,范围[2.0, 4.0]
):Q3 (
B
,范围[111, 500]
)的答案:而且,您可以非常自然地查询col
A
和B
!使用类似索引的'float',您总是希望将其用作列而不是直接索引操作 . 无论 endpoints 是否存在,这些都将起作用 .
Q1
Q2
Q3
如果您想要返回索引,只需设置它们即可 . 这是一个廉价的操作 .
如果你真的想要实际的索引值
要通过MultiIndex值查询df,例如where(A> 1.7)和(B <666):
因此,要获得例如'A'索引值,如果仍然需要:
问题是,在大数据帧中,索引选择的性能比排序的常规行选择差10% . 在重复性工作中,循环,延迟累积 . 见例子: