Pandas - перебирать данные и присоединяться, если какой-либо элемент списка соответствует какому-либо элементу другого списка - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть две серии, и каждая ячейка обеих серий содержит список элементов произвольной длины.Моя цель - выполнить перекрестное соединение между этими двумя сериями, но объединять строки только в том случае, если хотя бы один элемент списка ячеек серии соответствует элементу списка ячеек в другой серии.

Например:

series_a

0   [1geor, georg, eorge, orges, rgesq, gesqu, esq...
1   [1mark, marks, arksq, rksqu, ksqua, squar, qua...
2   [1prim, primr, rimro, imros, mrose, roses, ose...
3   [1shan, shank, hanka, ankar, nkars, karst, wew...
4   [1stka, stkat, tkath, katha, athar, thari, har...

series_b

0   [115br, 15bro, 5broa, broad, roadw, oadwa, adway]
1   [11par, 1park, parkp, arkpl, rkpla, kplac, place]
2   [125we, 25wes, 5west, west2, est25, st25t, t25th]
3   [135ma, 35mad, 5madi, madis, adiso, dison]
4   [135we, 35wes, 5west, west4, est41]

Я хочу проверить для каждой строки в series_a, является ли хотя бы один элемент в строке = элементом в строке series_b, и, если да, объединить эти строки в новом фрейме данных.

Итак, глядя на первый ряд series_a, проверяем, существует ли 1geor в 1-м, 2-м, 3-м.и т. д. список series_b;если TRUE, выполнить объединение, и если FALSE, не выполнять объединение.

Чтобы уточнить, возвращенный фрейм данных должен иметь два столбца, где первый столбец содержит ячейки из series_a, а второй столбец содержит ячейки из series_b.Для всех строк в этом кадре данных в списке в 1-м столбце должен быть хотя бы один элемент, который можно найти в списке во 2-м столбце.Например:

returned_df

0   [115br, 15bro, 5broa]                             | [15bro, abcde, 12345, hello, world, test1]
1   [11par, 1park, parkp, arkpl, rkpla]               | [parkp, broad]
2   [125we, 25wes, 5west, west2, est25, st25t, t25th] | [t25th, sadlf, 234lgk]
...

Если элемент в строке в series_a встречается более чем в одной строке в series_b, все комбинации совпадающих строк должны появиться в конечном кадре данных.

Что такоенаиболее эффективный код Python для этого упражнения?Код:

any(elem in b for elem in a)

легко отвечает на этот вопрос для двух конкретных списков, но я хочу перебрать обе серии во всей их полноте.

Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Я бы использовал понимание списка , когда у вас есть object dtypes в вашей серии, а pandas строковые методы и итерационные методы очень медленные.

elements = [(item, elem) for item in series_a.tolist()\
                         for elem in series_b.tolist()\
            if bool(set(item).intersection(elem))]

df_final = pd.DataFrame(elements)
...