我正在寻找在给定多个最终值标准的情况下返回所有第一层数据的语法。我一直在阅读和查找.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
谢谢!
答案 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)
如果为每个groupby
和flag
列创建了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)
现在,如果您希望x
和y
都满足任意值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
如果您希望同时满足x
和y
上的两个条件,则可以通过更改any
和{{1} }在&
中:
filter