[英]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 3xy 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
,并在每个x
和y
列创建一个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)
现在,如果希望x
和y
满足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
如果希望在同一行上同时满足x
和y
两个条件,则可以通过更改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.