【发布时间】:2013-07-29 01:32:39
【问题描述】:
代码示例:
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] 范围内重复,作为数据行数range - 预期返回值:[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 的答案是唯一索引值,现在与索引范围内的数据行数相同,但有重复。
对于不是索引的列,我知道上述问题的答案,但在索引的情况下,经过长时间的网络研究和 pandas 的功能实验,我没有成功。我现在看到的唯一方法(无需额外编程)是将 A 和 B 的副本作为索引之外的数据列。
【问题讨论】:
-
df.query和pd.eval似乎很适合这个用例。有关pd.eval()系列函数、它们的特性和用例的信息,请访问Dynamic Expression Evaluation in pandas using pd.eval()。
标签: python pandas indexing slice multi-index