我有一个巨大的 pandas 系列,包含 10.07 亿行字符串。我对其运行正则表达式提取(因此该任务与行顺序无关,可以并行运行),这需要几个小时,如下所示
df["big_string_column"].str.extract(r"Name: (.*), Value: (.*)")
或
df["big_string_column"].str.extractall(r"Name: (.*), Value: (.*)")
这将返回一个带有 2 个捕获组和列的新 DataFrame。
有没有办法使用 tqdm 或其他东西来显示这方面的进展? :)
是否可以将其重构为 dataframe.progress_apply ,它保留正则表达式中的捕获组,而不会造成重大性能影响(因为 pd.Series.str.extract 优化了正则表达式),或者是否有完全不同的方法?
最佳答案
我不知道 .str.extract
返回任何进度报告功能。将其更改为 .apply
以使用 .progress_apply
可能会带来不良的性能损失。
它既不漂亮,也不是一行行,但如果正在完成的工作是与行无关的(没有分组),您总是可以将 df
分成 block ,独立地完成工作 block ,并在最后将它们合并在一起。然后,您可以使用 tqdm 按 block 跟踪进度。
类似这样的事情:
# 1000 sections as an example, may need to adapt to your problem
chunks = np.array_split(df, 1000)
processed = []
for chunk in tqdm(chunks):
processed.append(chunk.str.extract(r"Name: (.*), Value: (.*)"))
out = pd.concat(processed)
关于Python Pandas/tqdm 显示提取进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538308/