【问题标题】:Python. Filling DataFrame: code optimisationPython。填充DataFrame:代码优化
【发布时间】:2018-06-12 12:20:24
【问题描述】:

我有大约 4M 行的大数据集。我需要通过正则表达式清理它并放入 Pandas 的 DataFrame 中。这是我的代码:

# 1) reading a text file with a dataset, where 4M rows
orgfile = open("good_dmoz.txt", "r")

# 2) create an empty dataframe
df0=pd.DataFrame(columns=['url'])

# 3) creating mask for cleaning data
regex = re.compile(r"(?<=\')(.*?)(?=\')")

# 4) clearing data and put into the dataframe
for line in orgfile:
    urls = regex.findall(line)
    df0.url = df0.append({"url": urls[0]}, ignore_index=True)

代码在一个小片段中处理任务,但处理完整数据(4M 行)需要太长时间。我的问题是:是否可以优化代码?优化,就是降低代码执行的速度。

谢谢!

【问题讨论】:

  • 你能告诉我们你用这段代码做什么吗?考虑提供一个示例输入和输出数据。
  • 如果我不知道要优化什么,就无法优化。祝你好运解决你自己的问题。
  • 那么每一行都有一个url吗?还是应该先检查? append 是让你的代码非常慢的原因,你只需用行 df0=pandas.read_csv(orgfile).str.replace(regex,'') 初始化 df0 就可以大大加快速度,你只需要否定正则表达式。

标签: python pandas dataframe optimization


【解决方案1】:

我同意 cmets 的问题。然而,我们都是从某个地方开始的。 Shokan,正如其他人所提到的,您遇到的性能问题部分是由于appendfor-loop。试试这个:

1.从文本文件创建熊猫数据框,仅一列,每行一行

df_rawtext = pd.read_csv('good_dmoz.txt', header = None, names = ['raw_data'], sep = '\n')

2。测试每行和过滤器是否存在正则表达式:

PATTERN = r"(?<=\')(.*?)(?=\')"
df_rawtext = df_rawtext.loc[df_rawtext.iloc[:,0].str.contains(PATTERN)]

3.提取模式

df_rawtext['URL'] = df_rawtext['raw_data'].str.extract(PATTERN, expand = False)

评论

我在这里执行第 2 步,因为第 3 步会为不匹配的行抛出错误。

ValueError: pattern contains no capture groups

如果有人知道更好的方法,请随时贡献。我渴望学习。

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2019-04-26
    • 2017-03-13
    • 2017-09-03
    • 1970-01-01
    • 2017-11-02
    • 2014-06-24
    • 2020-08-31
    • 2015-02-14
    相关资源
    最近更新 更多