比较2个Panda系列字符串列,并将差异存储在新列中

时间:2018-11-17 01:40:38

标签: python string pandas series difflib

这是我的第一个问题。 我有一个带有两列具有字符串值的pd数据框。 我在下面展示了一个字符串样本

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'])

以上是示例。这两个系列各有7200万行。

对于数据框中的每一行,我需要做两件事

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 ms

对于B:用于创建具有更改值的新列(我正在使用以下代码(来自stackoverflow帖子)

df1[['f1','f2','f3']]=df1['chang'].str.extractall('(?<=\*\s->\s)([0-9a-zA-Z0-9\.;]+(?=))').unstack()

我需要对至少1000万行执行以上操作。但是,每2万行花了30分钟才使我汗流

有人可以帮助我创建可以更快地完成上述步骤的代码

P.S。我使用的是Mac Pro,内存为8 GB,没有GPU。

0 个答案:

没有答案