匹配pd.系列中的连续对

x4shl7ld  于 2022-10-23  发布在  其他
关注(0)|答案(2)|浏览(162)

我有一个DataFrame,它看起来像这样:-

ID | act
 1    A 
 1    B
 1    C 
 1    D
 2    A
 2    B 
 3    A
 3    C

我正在尝试获取IDs,其中一个活动act1后面跟着另一个act2。例如,A之后跟着B的情况。在这种情况下,我想获取m1n 5o1p作为id。我如何以矢量化的方式来处理这个问题?
编辑:-预期输出:对于上面定义的示例df,输出应该是所有ID的列表/序列,其中A后面紧跟B

IDs
 1
 2
mbyulnm0

mbyulnm01#

这是一个简单的矢量化方法!

df.loc[(df.act == 'A') & (df.act.shift(-1) == 'B') & (df.ID == df.ID.shift(-1)), 'ID']

输出:

0    1
4    2
Name: ID, dtype: int64

另一种写法可能更清晰:

conditions = (df.act == 'A') & (df.act.shift(-1) == 'B') & (df.ID == df.ID.shift(-1))
df.loc[conditions, 'ID']

Numpy使筛选一个或多个布尔条件变得容易。结果向量用于过滤 Dataframe 。

44u64gxh

44u64gxh2#

这里有一种方法:groupby,而不是sort,因为我们需要根据当前的 Dataframe 结构,在A之后立即跟踪B。
使用str.cat的下一个聚合
检查A、B是否存在
获取索引
作为列表传递

(df
.groupby('ID',sort=False)
.Act
.agg(lambda x: x.str.cat(sep=','))
.str.contains('A,B')
.loc[lambda x: x==1]
.index.tolist()
 )

 [1, 2]

另一种方法是使用移位函数和滤波:

df['x'] = df.Act.shift()

df.loc[lambda x: (x['Act']=='B') & (x['x']=='A')].ID

相关问题