pandas 多索引 select 逻辑数组数据
pandas multi-index select data by logical arrays
这里我有一个数据框
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
我select数据如何通过逻辑判断使用loc函数?
像这样:a<20 and b > 1
您可以使用 Index.get_level_values
with boolean 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
的解决方案与另一个答案类似,只是将 &
更改为 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
1) 直接在 multi-indexed DF
的索引名称上使用 query
来执行布尔索引:
data.query("a < 20 & b > 1")
2) 如果你想事先有一个布尔掩码,请使用 eval
,然后根据此对 DF
进行子集化:
bool_mask = data.eval("a < 20 & b > 1")
data[bool_mask]
两种情况的结果 o/p:
这里我有一个数据框
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
我select数据如何通过逻辑判断使用loc函数? 像这样:a<20 and b > 1
您可以使用 Index.get_level_values
with boolean 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
的解决方案与另一个答案类似,只是将 &
更改为 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
1) 直接在 multi-indexed DF
的索引名称上使用 query
来执行布尔索引:
data.query("a < 20 & b > 1")
2) 如果你想事先有一个布尔掩码,请使用 eval
,然后根据此对 DF
进行子集化:
bool_mask = data.eval("a < 20 & b > 1")
data[bool_mask]
两种情况的结果 o/p: