Фильтруйте, заменяйте значение и объединяйте в один фрейм данных - PullRequest
0 голосов
/ 12 апреля 2020

Я немного запутался с for-l oop, и любая помощь приветствуется. Я использую данные MovieLens и мне нужно получить фрейм с пользователями и их непросмотренными фильмами.

Я ожидаю этот фрагмент кода на каждой итерации: 1. взять полный (test_data), вернуть фильмы, просмотренные только другими пользователями, 2. удалить дубликаты и получить только уникальный идентификатор movieId, 3. сбросить userId для пользователя 4. concatenate предыдущий пустой (emp) с not_watched пользователем:

users = [469, 64]
emp = pd.DataFrame(columns = ['userId','movieId'])
for user in users: 
    not_watched = test_data[test_data.loc[:,'userId'] != user]
    not_watched = not_watched.drop_duplicates(subset = 'movieId')
    not_watched.loc[:,'userId'] = user
    not_watched_full = pd.concat([emp,not_watched], ignore_index=True)
not_watched_full

Тем не менее, я получаю только последний пользователь из-l oop:

    userId  movieId
0   64  2599
1   64  542
2   64  1097
3   64  608
4   64  2947
... ... ...
93  64  59315
94  64  647
95  64  44191
96  64  694
97  64  68659

Вот данные:

test_data = pd.DataFrame({'userId': {72780: 469,
  9440: 64,
  33110: 226,
  3022: 20,
  18757: 120,
  48481: 313,
  69399: 448,
  81100: 514,
  51335: 331,
  39729: 274,
  47271: 307,
  21467: 140,
  6588: 45,
  2048: 18,
  39226: 273,
  89097: 577,
  1258: 10,
  28250: 195,
  8957: 62,
  29339: 201,
  25128: 177,
  94682: 599,
  89360: 580,
  98993: 608,
  29890: 204,
  37545: 253,
  62339: 414,
  46629: 306,
  48214: 312,
  40537: 274,
  31978: 219,
  1715: 17,
  42635: 288,
  13879: 89,
  43387: 290,
  64077: 414,
  84183: 537,
  88107: 567,
  56081: 370,
  49114: 318,
  4875: 30,
  23806: 165,
  53965: 356,
  25765: 177,
  56517: 375,
  21152: 140,
  60610: 391,
  99470: 608,
  4765: 29,
  36035: 246,
  54536: 358,
  74034: 474,
  73076: 473,
  14152: 91,
  96737: 603,
  818: 6,
  4769: 29,
  11998: 73,
  97057: 604,
  66703: 429,
  95352: 600,
  69066: 448,
  97683: 606,
  97667: 606,
  27328: 186,
  58059: 380,
  56469: 374,
  98000: 606,
  94890: 599,
  65981: 425,
  67978: 438,
  31876: 219,
  72029: 463,
  36711: 249,
  75164: 474,
  37300: 249,
  55056: 365,
  95101: 600,
  82790: 525,
  52738: 346,
  1433: 14,
  3168: 20,
  92199: 597,
  11287: 68,
  7091: 49,
  16336: 105,
  76603: 480,
  6162: 42,
  56993: 380,
  42304: 288,
  12364: 76,
  81816: 517,
  56622: 376,
  2402: 19,
  83677: 534,
  3460: 21,
  263: 3,
  67344: 435,
  84616: 544,
  11467: 68},
 'movieId': {72780: 2599,
  9440: 47,
  33110: 542,
  3022: 1097,
  18757: 608,
  48481: 2947,
  69399: 4866,
  81100: 440,
  51335: 91529,
  39729: 3016,
  47271: 4602,
  21467: 4369,
  6588: 1196,
  2048: 26614,
  39226: 608,
  89097: 1094,
  1258: 140110,
  28250: 4020,
  8957: 53125,
  29339: 2012,
  25128: 1962,
  94682: 61240,
  89360: 587,
  98993: 2021,
  29890: 67295,
  37545: 44555,
  62339: 94,
  46629: 5618,
  48214: 5219,
  40537: 74795,
  31978: 45666,
  1715: 1263,
  42635: 2664,
  13879: 96935,
  43387: 2618,
  64077: 6153,
  84183: 53322,
  88107: 139385,
  56081: 33794,
  49114: 1645,
  4875: 112852,
  23806: 858,
  53965: 3421,
  25765: 97921,
  56517: 2002,
  21152: 569,
  60610: 2028,
  99470: 32029,
  4765: 150,
  36035: 3910,
  54536: 66203,
  74034: 3272,
  73076: 4975,
  14152: 163,
  96737: 2739,
  818: 628,
  4769: 316,
  11998: 116823,
  97057: 62,
  66703: 329,
  95352: 1639,
  69066: 2616,
  97683: 1949,
  97667: 1809,
  27328: 593,
  58059: 161131,
  56469: 185,
  98000: 4482,
  94890: 96610,
  65981: 1210,
  67978: 5443,
  31876: 6539,
  72029: 7320,
  36711: 5903,
  75164: 49280,
  37300: 110102,
  55056: 81591,
  95101: 1,
  82790: 4016,
  52738: 714,
  1433: 784,
  3168: 4848,
  92199: 357,
  11287: 45950,
  7091: 110,
  16336: 3535,
  76603: 3624,
  6162: 2713,
  56993: 919,
  42304: 1225,
  12364: 57669,
  81816: 40339,
  56622: 2916,
  2402: 627,
  83677: 2628,
  3460: 59315,
  263: 647,
  67344: 44191,
  84616: 694,
  11467: 68659}})

1 Ответ

1 голос
/ 12 апреля 2020

В последней строке внутри for l oop вы впервые определяете not_watched_full . Поэтому каждый раз, когда вы go проходите через этот oop, вы переопределяете заново not_watched_full. Замените эту строку на

emp = pd.concat([emp,not_watched], ignore_index=True)

И ваша последняя строка должна отобразить emp.

...