У меня есть список уникальных случайных целых чисел и кадр данных со столбцом списков, как показано ниже:
>>> panel
[1, 10, 9, 5, 6]
>>> df
col1
0 [1, 5]
1 [2, 3, 4]
2 [9, 10, 6]
Вывод, который я хотел бы получить, - это длина перекрытия между panel
и каждый отдельный список в кадре данных:
>>> result
col1 res
0 [1, 5] 2
1 [2, 3, 4] 0
2 [9, 10, 6] 3
В настоящее время я использую функцию apply
, но мне было интересно, есть ли более быстрые способы, так как мне нужно создать много панелей и l oop через это задание для каждой панели.
# My version right now
def cntOverlap(panel, series):
# Typically the lists inside df will be much shorter than panel,
# so I think the fastest way would be converting the panel into a set
# and loop through the lists within the dataframe
return sum(1 if x in panel for x in series)
#return len(np.setxor1d(list(panel), series))
#return len(panel.difference(series))
for i, panel in enumerate(list_of_panels):
panel = set(panel)
df[f"panel_{i}"] = df["col1"].apply(lambda x: cntOverlap(panel, x))