Рассмотрим следующий фрагмент:
data = {"col1":["aaa","bbb","ccc","aaa","ddd","bbb"],
"col2":["fff","aaa","ggg","eee","ccc","ttt"]}
df = pd.DataFrame(data,columns=["col1","col2"]) # my actual dataframe has
# 20,00,000 such rows
list_a = ["ccc","aaa","mmm","nnn","ccc"]
list_b = ["ggg","fff","eee","ooo","ddd"]
# After doing a combination of 2 elements between the 2 lists in both orders,
# we get a list that resembles something like this:
new_list = ["ccc-ggg", "ggg-ccc", "aaa-fff", "fff-aaa", ..."ccc-fff", "fff-ccc", ...]
Учитывая огромный фрейм данных и 2 списка, я хочу подсчитать количество элементов в new_list, которые находятся в одном и том же фрейме данных. В приведенном выше псевдопримере результатом будет 3, как: «aaa-fff», «ccc -ggg», & «ddd - ccc» находятся в одной строке фрейма данных.
Прямо сейчас я использую алгоритм линейного поиска, но он очень медленный, так как мне приходится сканировать весь фрейм данных.
df['col3']=df['col1']+"-"+df['col2']
for a in list_a:
c1 = 0
for b in list_b:
str1=a+"-"+b
str2=b+"-"+a
str1=a+"-"+b
c2 = (df['col3'].str.contains(str1).sum())+(df['col3'].str.contains(str2).sum())
c1+=c2
return c1
Может ли кто-нибудь помочь мне реализовать более быстрый алгоритм, желательно со словарными данными структура?
Примечание: мне нужно перебрать 7000 строк другого фрейма данных и динамически создать 2 списка и получить совокупное количество для каждой строки.