我有一个包含两列的数据帧,分别是IDcondition.ID对应一个用户,该用户可以有多个条件.我想找出那些条件A和条件B的用户,怎么做?

示例数据帧:

ID 条件
1 A
2 B
1 B
1 C
2 C
2 D
1 E

如果我想获得以A、B为条件的用户,我只需要1作为输出. 如果我想获得以C、D作为条件的用户,我只需要2作为输出. 如果我想获得以B、C作为条件的用户,我需要1和2作为输出.

这些要求在数据帧中表示如下:

sl_no 条件
s1 [A,B]
s2 [C,D]
S3 [B,C]

我的try 如下:

       df1=df.groupBy('USER_ID').agg(F.collect_set('CONDITION').alias('conditions'))

       df2=conditions_data

       result=df1.join(df2,F.array_intersection(df1['conditions'],df2['conditions'])==df2['conditions'])

然而,我在结果中看到了一些不一致.我想知道是否有更好的方法来做到这一点.

推荐答案

收集每个ID的唯一条件

users = df1.groupby('ID').agg(F.collect_set('CONDITION').alias('CONDITION'))

# +---+------------+
# | ID|   CONDITION|
# +---+------------+
# |  1|[C, E, B, A]|
# |  2|   [C, B, D]|
# +---+------------+

将CONDITIONS_DATA与用户数据框连接,其中连接条件必须满足集合成员资格测试

cond = F.expr("size(array_intersect(conditions, CONDITION)) = size(conditions)")
result = conditions_data.join(users, on=cond, how='left')

# +-----+----------+---+------------+
# |sl_no|conditions| ID|   CONDITION|
# +-----+----------+---+------------+
# |   s1|    [A, B]|  1|[C, E, B, A]|
# |   s2|    [C, D]|  2|   [C, B, D]|
# |   s3|    [B, C]|  1|[C, E, B, A]|
# |   s3|    [B, C]|  2|   [C, B, D]|
# +-----+----------+---+------------+

收集Condition_Data中每个唯一行的用户

result = result.groupby(*conditions_data.columns).agg(F.collect_list('ID').alias('ID'))

# +-----+----------+------+
# |sl_no|conditions|    ID|
# +-----+----------+------+
# |   s1|    [A, B]|   [1]|
# |   s2|    [C, D]|   [2]|
# |   s3|    [B, C]|[1, 2]|
# +-----+----------+------+

Python相关问答推荐

如何将不同长度的新列添加到现有的框架中

具有多个组的条形图的不同y标度

如何知道标志是否由用户传递或具有默认值?

如何使用PyTest根据self 模拟具有副作用的属性

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

如何使用Jinja语法在HTML中重定向期间传递变量?

在Python中对分层父/子列表进行排序

acme错误-Veritas错误:模块收件箱没有属性linear_util'

需要计算60,000个坐标之间的距离

Python中的嵌套Ruby哈希

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

发生异常:TclMessage命令名称无效.!listbox"

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

try 将一行连接到Tensorflow中的矩阵

如何在WSL2中更新Python到最新版本(3.12.2)?

如何将多进程池声明为变量并将其导入到另一个Python文件

为什么抓取的HTML与浏览器判断的元素不同?

无法连接到Keycloat服务器

如何获取Python synsets列表的第一个内容?

在numpy数组中寻找楼梯状 struct