Декартово произведение Панд, отфильтрованное по столбцам других данных - PullRequest
0 голосов
/ 28 октября 2018

У меня есть CSV-файл со столбцами img_A, img_B и целевыми значениями.

CSV 1:

     img_A        img_B   target
    img1.png    img2.png    1
    img1.png    img3.png    1
    img1.png    img4.png    0
    img1.png    img5.png    1
    img6.png    img1.png    0

У меня есть другой огромный CSV-файл, содержащий все изображенияи их векторы функций, такие как:

csv2:

       img     f1  f2  f3  f4  f5
    img1.png    0   1   0   1   0

Мне нужен объединенный вектор объектов, такой как:

     img_A   img_B   f1_A  f2_A  f3_A  f4_A f5_A f1_B f2_B f3_B f4_B f5_B target
   img1.png img_2.png 0    1      0     1     0    0    1    0   1     0   1

Пока мойПервое впечатление - получить декартово произведение путем слияния csv2 с самим собой, а затем отфильтровать его с комбинациями столбцов в csv1. Я получаю ошибку памяти, поскольку форма csv2 составляет около 20000 x 512, а форма csv1 - около 75000 x 3.

Я попробовал это:

df = df.assign(key=1).merge(df.assign(key=1), on="key", suffixes=["_A", "_B"]).drop("key", axis=1) # memory error

Хотя я пытался разбить данные на куски, получение результата длилось вечно.

Может кто-нибудь предложить оптимальный способ сделать это?

1 Ответ

0 голосов
/ 28 октября 2018

Для данных фреймов df1 с df2 вы можете объединиться дважды после переименования столбцов в df2:

res = df1.merge(df2.add_suffix('_A'), on='img_A')\
         .merge(df2.add_suffix('_B'), on='img_B')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...