我有一个形式的数据框:
ID | COL
1 A
1 B
1 C
1 D
2 A
2 C
2 D
3 A
3 B
3 C
我也有一个包含序列的列表列表,例如seq = [[A,B,C],[A,C,D]]
。
我正在尝试计算数据框中ID中与ID中的COL
项完全匹配的ID数seq
。我目前正在通过以下方式进行操作:-
df.groupby('ID')['COL'].apply(lambda x: x.reset_index(drop = True).equals(pd.Series(vs))).reset_index()['COL'].count()
遍历vs
,vs
清单从哪里来seq
。
预期产量:-
ID | is_in_seq
1 0
2 1
3 1
由于COL
for ID
1中的序列是ABCD,而不是in中的序列seq
,因此其对应的值为0。
问题:-
1.)是否有矢量化的方法来执行此操作?我上面概述的方法即使对于中的单个条目也要花费很多时间seq
,因为每个ID最多可以有30-40个值,并且保持顺序COL
至关重要。
IIUC:
您只会产生零或一。因为您将检查整个组(只有一个整体)是否在中seq
。如果seq
是唯一的(我假设是唯一的),那么您将永远只有这个群组seq
。
第一步是使seq
一个set
的tuples
seq = set(map(tuple, seq))
第二步是产生一个包含元组的聚合熊猫对象
tups = df.groupby('ID')['COL'].agg(tuple)
tups
ID
1 (A, B, C, D)
2 (A, C, D)
3 (A, B, C)
Name: COL, dtype: object
第三步,我们可以使用 isin
tups.isin(seq).astype(int).reset_index(name='is_in_seq')
ID is_in_seq
0 1 0
1 2 1
2 3 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句