繁体   English   中英

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

[英]Dataframe filter with multi-index: return all rows at top index level given value filters

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

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

因此,从这样的数据帧中: xy AB ab 1 2 af 4 5 ac 3 4 bd 1 5
bc 1 2 cd 2 3
xy AB ab 1 2 af 4 5 ac 3 4 bd 1 5
bc 1 2 cd 2 3

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

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

xy AB ab 1 2 af 4 5 ac 3 4 bd 1 5 bc 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。 返回:

xy AB a b 1 2 a f 4 5 ac 3 4

谢谢!

您可以通过以下几个步骤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'])

使用groupby + transform + any

df[df.eq({'x':1,'y':2}).groupby(level=0).transform('any').any(1)]
     x  y
A B      
a b  1  2
  f  4  5
  c  3  4
b d  1  5
  c  1  2

您可以在level ='A'上使用groupby ,并在每个xy列创建一个flag列之后进行filter如果要查找的值是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相同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&filter的位置来实现:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM