具有多索引的数据框过滤器:在给定值过滤器的情况下返回顶级索引级别的所有行

时间:2019-01-01 01:23:32

标签: python pandas multi-index

我正在寻找在给定多个最终值标准的情况下返回所有第一层数据的语法。我一直在阅读和查找.loc或.xs的过滤解决方案,但我可以完全根据自己的需要获取语法。 我曾经使用过xpath,但实际上我只想要//A[ B [ @x=1 and @y=2]]

我已经尝试过许多我熟悉的使用df.loc df.xs mutlti []形式的语法置换,以及一些df.index.get_level_values()等……

所以从这样的数据帧中: x y A B a b 1 2 a f 4 5 a c 3 4 b d 1 5
b c 1 2 c d 2 3

我想搜索x和y的特定组合,并返回A索引级别的所有行。

所以我想要x = 1和y = 2并得到

x y A B a b 1 2 a f 4 5 a c 3 4 b d 1 5 b c 1 2

因为给定的A至少有1个单行匹配

更好的通用解决方案是搜索特定B的x值和特定不同B的y值。

(为更加清晰起见):我的意思是,我可能只对特定的B值感兴趣,而不是寻找的最终水平值。 下面我有B 1 = b和x = 3。所以我将匹配值与索引值进行混合。而之前我限制了两个最终值。再次,我在xpath中像 //A[ B [ local-name() == b and @x=3] and B[ local-name() == f and @y=5] ] 一样设想了这一点(我认为我没错)。

例如,B 1 = b:x = 3和B 2 = f:y = 5。返回:

x y A B a b 1 2 a f 4 5 a c 3 4

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以通过以下几个步骤query您的数据框:

A_idx = df.query('x == 1 & y == 2').index.get_level_values('A')
res = df.query('A in @A_idx')

print(res)

#      x  y
# A B      
# a b  1  2
#   f  4  5
#   c  3  4
# b d  1  5
#   c  1  2

设置

df = pd.DataFrame([['a', 'b', 1, 2], ['a', 'f', 4, 5], ['a', 'c', 3, 4],
                   ['b', 'd', 1, 5], ['b', 'c', 1, 2], ['c', 'd', 2, 3]],
                  columns=['A', 'B', 'x', 'y'])

df = df.set_index(['A', 'B'])

答案 1 :(得分:2)

使用print (df.groupby(level='A').filter(lambda dfg: (dfg.flagx & dfg.flagy).any() ) .drop(['flagx','flagy'],axis=1)) x y A B b d 1 5 c 1 2 + groupby + transform

any

答案 2 :(得分:1)

如果为每个groupbyflag列创建了x列,则可以在级别='A'和filter上使用y正在使用numpy.where查找其中的内容。

#using @jpp setup
import numpy as np
df['flagx'] = np.where(df.x == 1,1,0)
df['flagy'] = np.where(df.y == 5,1,0)

现在,如果您希望xy都满足任意值B和相同的A的条件,则可以使用any在每个标志上,并使用&查找两者:

print (df.groupby(level='A').filter(lambda dfg: dfg.flagx.any() & dfg.flagy.any() )
         .drop(['flagx','flagy'],axis=1))
     x  y
A B      
a b  1  2
  f  4  5
  c  3  4
b d  1  5
  c  1  2

如果您希望同时满足xy上的两个条件,则可以通过更改any和{{1} }在&中:

filter