Сравните 2 строковых столбца серии Panda и сохраните разницу в новых столбцах - PullRequest
0 голосов
/ 17 ноября 2018

Это мой первый вопрос. У меня есть 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 ГБ и без графического процессора.

...