指定值和前面值的子集df

2024-04-25 21:02:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是在特定值上对df进行子集。使用下文,这些记录在items中,即BD。我还希望对BD前面的行进行子集,它们记录在other_itemsXY)中。注意:我只想返回BD之前的最后一项。所以它们在{},{}之前持续{},{}

本质上,查找包含BD的每一行,并返回前面最后一行,该行等于XY。问题是它可能在1-10行之间

import pandas as pd

df = pd.DataFrame({   
    'Val' : [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4],             
    'ID' : ['X','Y','B','X','C','X','C','D','E','Y','Y','A','B','C','X','C','Y','D','E','A'],                 
    })

items = ['B','D']

other_items = ['X','Y']

df = df.loc[(df['ID'].isin(items)) | df['ID'].shift(-1).isin(items) & (df['ID'].isin(other_items))]

预期产出:

    Val ID
1     1  Y
2     1  B
5     2  X
7     2  D
10    3  Y
12    3  B
16    4  Y
17    4  D

1条回答
网友
1楼 · 发布于 2024-04-25 21:02:29

首先按两个列表的总和仅筛选行,然后按上一个和下一个值筛选:

items = ['B','D']
other_items = ['X','Y']

df = df[df['ID'].isin(other_items + items)]

m1 = df['ID'].isin(other_items) & df['ID'].shift(-1).isin(items)
m2 = df['ID'].isin(items) & df['ID'].shift().isin(other_items)

如果需要按组处理:

m1 = df['ID'].isin(other_items) & df.groupby('Val')['ID'].shift(-1).isin(items)
m2 = df['ID'].isin(items) & df.groupby('Val')['ID'].shift().isin(other_items)

最后一个过滤器:

df = df[m1 | m2]
print (df)
    Val ID
1     1  Y
2     1  B
5     2  X
7     2  D
10    3  Y
12    3  B
16    4  Y
17    4  D

相关问题 更多 >