Python.Заполнение DataFrame: оптимизация кода - PullRequest
0 голосов
/ 12 июня 2018

У меня большой набор данных с примерно 4M строк.Мне нужно очистить его с помощью регулярных выражений и поместить в DataFrame Pandas.Вот мой код для этого:

# 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 строк) требуется слишком много времени .У меня вопрос: можно ли оптимизировать код?Под оптимизацией я подразумеваю снижение скорости выполнения кода.

Спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Согласен с комментариями к вопросу.Тем не менее, мы все начали откуда-то.Shokan, как уже упоминали другие, проблема производительности, с которой вы сталкиваетесь, возникает из-за петли append и for.Попробуйте это:

1.Создать pandas dataframe из текстового файла, только один столбец, одна строка на строку

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

Если кто-то знает лучший способ, не стесняйтесь вносить свой вклад.Я очень хочу учиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...