Как можно повысить скорость сотен вызовов pandas .lo c для 1M строк данных? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть pandas фрейм данных около 1M строк и растет. Мне нужно сделать несколько поисков без учета регистра в столбце и назначить другое значение для другого столбца, если он найден. Текущий способ, которым я выполняю это:

df.loc[df.columnA.str.contains('(?i)^match_string', na=False, regex=True), 'columnB'] = 'New Value'

Таким образом, он ищет в columnA все, что начинается с match_string, без учета регистра затем, если он найден, он присваивает New Value columnB.

Проблема в том, что мне нужно сделать это несколько сотен раз, и это действительно медленно. Я рассмотрел использование .at вместо .loc, но у меня сложилось впечатление, что вы можете использовать .at только для поиска одного значения, и мне нужно найти все без исключения экземпляры match_string (то есть match_string может встречаться в нескольких строках columnA). Я не прав - могу ли я использовать .at здесь?

Какой самый быстрый способ go по этому поводу? В настоящее время на это уходит более часа, и с ростом размера данных ситуация будет только ухудшаться.

1 Ответ

2 голосов
/ 24 февраля 2020

Есть несколько советов, которые могут помочь вам улучшить обработку

1) Создать новый столбец столбца C, который клонирует столбец A, но в нижнем регистре. И затем, конечно, убедитесь, что вы используете строчную строку match_string. Это позволит избежать поиска без учета регистра.

2) Вы даже можете создать свой столбец C с подстрокой columnA: N-й первый символ, N длина строки match_string.

Эти 2 пункта помогут вам свести проблему регулярного выражения к базовому c сравнению строк, а не к выполнению регулярных выражений. Оценка регулярного выражения - не сопоставление с образцом. Ну, это может быть один из способов использования регулярных выражений, но он создает автомат для каждого регулярного выражения, которое вы хотите применить.

Кроме того, когда вы снова и снова используете одно и то же регулярное выражение, вы должны создать экземпляр одного совпадения класс и повторно использовать его вместо «содержит». Это похоже на компиляцию кода, но для регулярных выражений.

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