这是我的第一个问题。 我有一个带有两列具有字符串值的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。