[英]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.