首页 > 解决方案 > 熊猫系列与列表列表完全匹配

问题描述

我有一个形式的数据框:

      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]]

我正在尝试计算数据框中与 in 中COL 的条目完全匹配的 ID 数量seq。我目前正在通过以下方式进行操作:-

df.groupby('ID')['COL'].apply(lambda x: x.reset_index(drop = True).equals(pd.Series(vs))).reset_index()['COL'].count()

迭代,列表来自vs哪里。vsseq

预期输出:-

  ID | is_in_seq   
   1    0 
   2    1
   3    1 

由于 1 中的序列COLIDABCD,而不是 中的序列seq,因此反对它的值为 0。

问题:-

1.) 是否有一种矢量化的方式来执行此操作?我在上面概述的方法即使对于来自 的单个条目也需要大量时间seq,因为每个 ID 在 col 中最多可以有 30-40 个值,并且保持顺序COL至关重要。

标签: pandaspandas-groupby

解决方案


IIUC:
你永远只会产生一个零或一个。因为您将检查整个组(并且只有一个整体)是否在seq. 如果seq是唯一的(我假设它是唯一的),那么您将永远只拥有该组seq

第一步是制作seq一个settuples

seq = set(map(tuple, seq))

第二步是生成一个包含元组的聚合 pandas 对象

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

推荐阅读