pandas - 熊猫系列与列表列表完全匹配
问题描述
我有一个形式的数据框:
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
哪里。vs
seq
预期输出:-
ID | is_in_seq
1 0
2 1
3 1
由于 1 中的序列COL
是ID
ABCD,而不是 中的序列seq
,因此反对它的值为 0。
问题:-
1.) 是否有一种矢量化的方式来执行此操作?我在上面概述的方法即使对于来自 的单个条目也需要大量时间seq
,因为每个 ID 在 col 中最多可以有 30-40 个值,并且保持顺序COL
至关重要。
解决方案
IIUC:
你永远只会产生一个零或一个。因为您将检查整个组(并且只有一个整体)是否在seq
. 如果seq
是唯一的(我假设它是唯一的),那么您将永远只拥有该组seq
。
第一步是制作seq
一个set
tuples
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
推荐阅读
- c# - 多次运行 Nunit 测试用例的子集
- javascript - 让用户在任何时区输入日期和时间,并确保它们从用于数据库存储的时区转换为 UTC?
- javascript - Using Excel Formulas in JavaScript code outside of excel
- c++ - 链表的排序插入函数
- java - 如何在 Mongo 中取消设置嵌套对象图并在投影中公开某个对象图深度
- excel - 需要将 CPU 和内存信息发送到 Excel 工作表
- css - 如何使网格内的弹性框中的图像占据 100% 的高度
- android - 如何在 android jetpack compose ui 中实现水平滚动条?
- google-apps-script - 编辑单元格时从今天开始一周设置截止日期的脚本
- c# - 如何使用 Checkbox 的 C# 显示 DataGridView 列