Python 具有多索引的Dataframe筛选器:返回顶级索引级别的所有行给定值筛选器
我正在寻找返回所有给定多个最终值条件的第一层数据的语法。我一直在阅读和寻找使用.loc或.xs的过滤解决方案,但我完全可以得到我想要的语法。 我过去使用xpath,本质上我只想要A[B[@x=1和@y=2] 我已经尝试了很多我熟悉的语法排列,使用df.loc df.xs mutlti[]的形式,还有一点使用df.index.get_level_values()等 因此,从这样的数据帧:Python 具有多索引的Dataframe筛选器:返回顶级索引级别的所有行给定值筛选器,python,pandas,multi-index,Python,Pandas,Multi Index,我正在寻找返回所有给定多个最终值条件的第一层数据的语法。我一直在阅读和寻找使用.loc或.xs的过滤解决方案,但我完全可以得到我想要的语法。 我过去使用xpath,本质上我只想要A[B[@x=1和@y=2] 我已经尝试了很多我熟悉的语法排列,使用df.loc df.xs mutlti[]的形式,还有一点使用df.index.get_level_values()等 因此,从这样的数据帧: xy A B a b12 f 4 5 a c 3 4 b d 15 b c 1 2 c d23 我想搜索x和
xy
A B
a b12
f 4 5
a c 3 4
b d 15
b c 1 2
c d23
我想搜索x和y的特定组合,并返回索引级别的所有行
所以我想要x=1,y=2,得到
xy
A B
a b12
a f45
a c34
b d15
b c12
因为给定a中至少有一行匹配
更好的更普遍的解决方案是搜索特定B的x值和特定不同B的y值
(试图更清楚):我的意思是,我可能只对组合特定的B值感兴趣,而不是我正在寻找的最终级别值。
下面是B1=b和x=3。所以我混合了匹配一个值和匹配一个索引值。而之前我限制了两个最终值。同样,我在xpath中设想了这一点,比如//A[B[local-name()==B和@x=3]和B[local-name()==f和@y=5]
(我想我是对的)
例如,B1=b:x=3,B2=f:y=5。返回:
xy
A B
ab12
af45
a c 3 4
谢谢 您可以通过以下几个步骤创建数据帧:
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'])
如果要查找的值包含在
x
和y
列中,则可以在级别='A'上使用groupby
,并在为每个x
和y
列创建标志后使用
现在,如果您希望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
上的两个条件,则可以通过更改过滤器中任意
和的位置来实现:
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
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
你能更清楚地说明问题的第二部分吗?是否必须满足所有条件,以及以何种组合?或者你还在按A
进行过滤吗?新年快乐:-)这对该示例数据集非常有效。是否可以调整以容纳带有空格的索引。。。例如,“A 2”而不是“A”?快速阅读空间和查询似乎不太合拍。谢谢(新年快乐!)@DontJudgeMyADD,您可以随时使用loc
,例如将df.query('x==1&y==2')
替换为df.loc[df['x'].eq(1)和df['y'].eq(2))
。新年快乐!@W-B,新年快乐!祝你新年快乐:-)@W-B你也是,关于stackoverflow的很多答案:-)谢谢,我成功了。它还允许我非常轻松地处理带有空格的索引。谢谢!新年快乐!很好的方法eq
,在adict
:-)嗨!返回这是一张空白的桌子,我错过了dict设置,对吗?Thanks@DontJudgeMyADD{'x':1,'y':2}这是我使用的dict。在我身边工作得很好谢谢@W-B,我不知道为什么它对我不起作用。我直接复制粘贴了它,无法获取.eq()我已经搜索了很长一段时间,也找不到一个关于使用.eq的好教程。
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