Это мой первый вопрос.
У меня есть pd dataframe с двумя столбцами, имеющими строковые значения.
Я представляю ниже образец строк
s = pd.Series(['What * cool - you took 0% RTA * inr'])
r = pd.Series(['What : auto;bus;car;1;Metro cool - you took 0% RTA = 0.38 inr'])
Выше приведен пример. в обеих сериях по 72 миллиона строк.
Мне нужно сделать 2 вещи для каждой строки в кадре данных
A. Рассчитайте разницу между двумя строками (столбца s и столбца r) и
B. сохранить значение для каждого * в новом столбце
Для A: Я использую функцию ниже (я скопировал из сообщения stackoverflow) для расчета разницы и сохранения в новом столбце
def inline_diff(a, b):
import difflib
matcher = difflib.SequenceMatcher(None, a, b)
def process_tag(tag, i1, i2, j1, j2):
if tag == 'replace':
return '{' + matcher.a[i1:i2] + ' -> ' + matcher.b[j1:j2] + '}'
if tag == 'delete':
return '{- ' + matcher.a[i1:i2] + '}'
if tag == 'equal':
return matcher.a[i1:i2]
if tag == 'insert':
return '{+ ' + matcher.b[j1:j2] + '}'
assert false, "Unknown tag %r"%tag
return ''.join(process_tag(*t) for t in matcher.get_opcodes())
for i in range(len(s)):
df1['chang'][i]=inline_diff(s[i], r[i])
Когда я попытался рассчитать этот шаг для 20000 строк, я получил общее время приблизительно 30 минут
start1 = time.time()
for i in range(len(s)):
df1['chang'][i]=inline_diff(s[i], r[i])
end1= time.time()
print("Took %f ms in total" % ((end1 - start1) * 1000.0))
Всего заняло 1878017,782927 мс
Для B: для создания новых столбцов со значениями изменений, которые я использую нижеприведенным кодом (из сообщения stackoverflow)
df1[['f1','f2','f3']]=df1['chang'].str.extractall('(?<=\*\s->\s)([0-9a-zA-Z0-9\.;]+(?=))').unstack()
Мне нужно выполнить вышеуказанное как минимум для 10 миллионов строк. Но время, занятое 30 минутами для рядов 20К, вызывает у меня пот.
Может ли кто-нибудь помочь мне в создании кода, который может быстрее выполнять описанные выше шаги
P.S. Я использую Mac Pro с оперативной памятью 8 ГБ и без графического процессора.