Python 如何为dataframe创建一个函数来检查大元组是否包含小元组的所有元素?

Python 如何为dataframe创建一个函数来检查大元组是否包含小元组的所有元素?,python,pandas,Python,Pandas,经过24小时毫无意义的尝试,我除了“救命”之外,再也没有别的词了 我发现数据框包含两列:“uid”int,“course_id”作为2个或更多其他id(int)的元组 液体 课程号 1. (1,2) 2. (1,2) 3. (1,3) 4. (1,2,3) 5. (2,3) 假设您已经有一列包含所有唯一对,下面是一种计算用户数的方法: 您可以将对中的项目数作为课程id的子集使用和计数,如下所示: df2['users'] = df2['pair'].map(lambda x: len([y fo

经过24小时毫无意义的尝试,我除了“救命”之外,再也没有别的词了 我发现数据框包含两列:“uid”int,“course_id”作为2个或更多其他id(int)的元组

液体 课程号 1. (1,2) 2. (1,2) 3. (1,3) 4. (1,2,3) 5. (2,3)
假设您已经有一列包含所有唯一对,下面是一种计算用户数的方法:

您可以将
对中的项目数作为
课程id
的子集使用和计数,如下所示:

df2['users'] = df2['pair'].map(lambda x: len([y for y in df1['course_id'].values if set(x).issubset(y)]))


print(df2)

     pair  users
0  (1, 2)      3
1  (1, 3)      2
2  (2, 3)      2
此解决方案的一个警告可能是关于大量行的性能问题。我还没有测试过。您可以尝试一下,看看它是否能满足您的系统性能要求。

Setup 解决方案 解释 对
课程id
列进行热编码,为
课程id
中的每个唯一值创建指标变量,然后通过在
级别=0
上取
总和,沿
轴=0
减少编码变量

>>> onehot

     1  2  3
uid         
1    1  1  0
2    1  1  0
3    1  0  1
4    1  1  1
5    0  1  1
现在,对从
course\u id
列中的唯一值组合中获得的所有对进行迭代,并为每对计算存在这些对的onehot编码数据帧中的行数

>>> cnt

{(1, 2): 3, (1, 3): 2, (2, 3): 2}
现在从上面的字典创建一个新的数据框,其中包含
course\u id

>>> counts

    pairs  count
0  (1, 2)      3
1  (1, 3)      2
2  (2, 3)      2

可以安全地假设元组
(1,2)
(2,1)
相同吗?@it\u是Chris yep,它完全相同same@alex
uid
列是否可以包含重复的条目?@ShubhamSharma原始数据框,带有1个uid和1个课程id?是。我记得uid最多可以有7个课程,所以它将在df中出现7次。带元组的组合df-否、唯一uid和唯一过程的元组_ids@ShubhamSharma这就是我如何制作组合df(我问题中的第一个表):D
pair_list=[]for I in df_mcid.resource_id:pair_list.append(list(itertools.combines(I,2)))pair_list=list(set(itertools.chain(*pair_list)))
这是我的独特配对。嗯。。。它可以用,我可以试试。如果我有13k个唯一UID和1100个课程,这不是太复杂了吗?@Alex不确定复杂性,但这里我们从原始数据帧开始,这保存了聚合数据帧以计算元组的中间步骤。。你可以试试这个解决办法,我已经试过了。是的,它工作得很好,甚至比前面的答案更快!更多的编码,但更快:)你太棒了,老兄,非常感谢你!
>>> cnt

{(1, 2): 3, (1, 3): 2, (2, 3): 2}
>>> counts

    pairs  count
0  (1, 2)      3
1  (1, 3)      2
2  (2, 3)      2