сравнить два столбца в двух таблицах в pandas на основании заданного условия c - PullRequest
1 голос
/ 17 марта 2020

У меня есть два фрейма данных, как показано ниже.

таблица пользователей: сведения о курсах и модулях, посещаемых каждым пользователем.

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

Таблица курсов: сведения о курсах и все Модули этого курса и популярные модули.

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

Из приведенных выше таблиц сравните два столбца и модули, которые должны присутствовать, и предложите модули для каждого пользователя, посещаемые автоматически.

  1. Предложить популярный модуль в посещаемом курсе, если пользователь еще не посещал этот модуль.
  2. Предложите необслуживаемый модуль в текущих курсах в порядке, указанном в таблице курсов.
  3. Предложите 3 модуля всем пользователи из всех курсов, которые он посещал, если в этом курсе доступно 3 модуля.

Ожидаемый результат:

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

РЕДАКТИРОВАТЬ:

Добавлен user_id = 9 (последняя строка)

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

Вывод вышеуказанного кода:

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

Где в Recommended_modules for user_id = 9, курс A имеет пустой список

ie {A: [], B: [8]} ожидается {B: [8]}

Ожидаемый результат:

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

1 Ответ

1 голос
/ 17 марта 2020

Используйте функцию cunstom с разницей между словарями, lastm создайте новый словарь ie с if-else для пустых списков на входе также пустой список:

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

pop = df2['Popular_modules'].to_dict()
#print (pop)

def f(x):
    out = {}
    for k, v in x.items():
        dif = [i for i in mo[k] if i not in v]
        a = [i for i in pop[k] if i in dif]
        b = [i for i in dif if i not in pop[k]]
        c = a + b
        out[k] = c[:3]    
    return out

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

РЕДАКТИРОВАТЬ: Если пустой список находится в словарях во attended_modules входном столбце и нужно удалить его, в выходной функции изменена:

def f(x):
    out = {}
    for k, v in x.items():
        dif = [i for i in mo[k] if i not in v]
        a = [i for i in pop[k] if i in dif]
        b = [i for i in dif if i not in pop[k]]
        c = a + b
        if len(v) > 0:
            out[k] = c[:3]    
    return out
...