熊猫多索引按逻辑数组选择数据

Posted

技术标签:

【中文标题】熊猫多索引按逻辑数组选择数据【英文标题】:pandas multi-index select data by logical arrays 【发布时间】:2017-07-03 20:20:40 【问题描述】:

这里我有一个数据框

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(100).reshape(20,5), columns=list('abcde'))
data = data.set_index(['a', 'b'])
print(data.head())
        c   d   e
a  b
0  1    2   3   4
5  6    7   8   9
10 11  12  13  14
15 16  17  18  19
20 21  22  23  24

如何通过逻辑判断选择数据使用 loc 函数? 像这样:a 1

【问题讨论】:

【参考方案1】:

1) 直接在多索引DF 的索引名称上使用query 来执行布尔索引:

data.query("a < 20 & b > 1")

2) 如果您想事先有一个布尔掩码并在以后基于此子集 DF,请使用 eval

bool_mask = data.eval("a < 20 & b > 1")
data[bool_mask]

两种情况的结果 o/p:

【讨论】:

【参考方案2】:

您可以将Index.get_level_valuesboolean indexing 一起使用:

mask = (data.index.get_level_values('a') < 20) & (data.index.get_level_values('b') > 1)
print (mask)
[False  True  True  True False False False False False False False False
 False False False False False False False False]

print (data[mask])
        c   d   e
a  b             
5  6    7   8   9
10 11  12  13  14
15 16  17  18  19

DataFrame.query 的解决方案与另一个答案类似,只是将&amp; 更改为and

print (data.query("a < 20 and b > 1"))
        c   d   e
a  b             
5  6    7   8   9
10 11  12  13  14
15 16  17  18  19

Query python versus pandas syntax comparison.

【讨论】:

以上是关于熊猫多索引按逻辑数组选择数据的主要内容,如果未能解决你的问题,请参考以下文章

3维numpy数组到多索引熊猫数据框

熊猫使用多索引选择第二个索引的最后一行

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框

将 numpy 数组复制到 Panda 多索引中(大小相同)

如果存在多索引,熊猫将不允许选择列?