比较熊猫不同数据框中的两列

时间:2020-03-18 06:33:57

标签: pandas pandas-groupby

我有两个表,如下所示

用户表:

user_id     courses        attended_modules             
1           [A]            {A:[1,2,3,4,5,6]}            
2           [A,B,C]        {A:[8], B:[5], C:[6]}       
3           [A,B]          {A:[2,3,9], B:[10]}           
4           [A]            {A:[3]}                     
5           [B]            {B:[5]}                     
6           [A]            {A:[3]}                      
7           [B]            {B:[5]}                     
8           [A]            {A:[4]}                     

课程表:

course_id         modules                         
A                 [1,2,3,4,5,6,8,9]                   
B                 [5,8]                              
C                 [6,10] 

从上面的内容中,比较用户表中的有人参与模块和课程表中的模块。如下所述在用户表Remaining_module中创建一个新列。

示例:user_id = 1,参加了课程A,并且参加了6个模块,课程中共有8个模块,因此Remaining_module = {A:2}

类似地,对于user_id = 2,Remaining_module = {A:7,B:1,C:1} 等等...

预期输出:

user_id     attended_modules                #Remaining_modules
1           {A:[1,2,3,4,5,6]}               {A:2}
2           {A:[8], B:[5], C:[6]}           {A:7, B:1, C:1}
3           {A:[2,3,9], B:[8]}              {A:5, B:1}
4           {A:[3]}                         {A:7}
5           {B:[5]}                         {B:1}
6           {A:[3]}                         {A:7}
7           {B:[5]}                         {B:1}
8           {A:[4]}                         {A:7}

1 个答案:

答案 0 :(得分:3)

想法是生成器和True之和的比较匹配值:

df2 = df2.set_index('course_id')
mo = df2['modules'].to_dict()
#print (mo)

def f(x):
    return {k: sum(i not in v for i in mo[k]) for k, v in x.items()}

df1['Remaining_modules'] = df1['attended_modules'].apply(f)
print (df1)
   user_id  courses                attended_modules         Remaining_modules
0        1      [A]       {'A': [1, 2, 3, 4, 5, 6]}                  {'A': 2}
1        2  [A,B,C]  {'A': [8], 'B': [5], 'C': [6]}  {'A': 7, 'B': 1, 'C': 1}
2        3    [A,B]     {'A': [2, 3, 9], 'B': [10]}          {'A': 5, 'B': 2}
3        4      [A]                      {'A': [3]}                  {'A': 7}
4        5      [B]                      {'B': [5]}                  {'B': 1}
5        6      [A]                      {'A': [3]}                  {'A': 7}
6        7      [B]                      {'B': [5]}                  {'B': 1}
7        8      [A]                      {'A': [4]}                  {'A': 7}