Почему преобразование слов в единственное число из множественного числа в цикле for занимает так много времени (Python 3)?

Это мой код для чтения текста из файла CSV и преобразования всех слов в его столбце в форму единственного числа из множественного числа:

import pandas as pd
from textblob import TextBlob as tb
data = pd.read_csv(r'path\to\data.csv')

for i in range(len(data)):
    blob = tb(data['word'][i])
    singular = blob.words.singularize()  # This makes singular a list
    data['word'][i] = ''.join(singular)  # Converting the list back to a string

Но этот код работает уже несколько минут (и, возможно, будет работать часами, если я его не остановлю?)! Почему это? Когда я проверял несколько слов по отдельности, преобразование происходит мгновенно - вообще не занимает времени. В файле всего 1060 строк (слов для преобразования).

РЕДАКТИРОВАТЬ: Он закончил работать примерно через 10-12 минут.

Вот некоторые примеры данных:

Вход:

word
development
investment
funds
slow
company
commit
pay
claim
finances
customers
claimed
insurance
comment
rapid
bureaucratic
affairs
reports
policyholders
detailed

Выход:

word
development
investment
fund
slow
company
commit
pay
claim
finance
customer
claimed
insurance
comment
rapid
bureaucratic
affair
report
policyholder
detailed

person Kristada673    schedule 10.07.2018    source источник
comment
Вы перебираете фрейм данных. Производительность будет ужасной..   -  person rafaelc    schedule 10.07.2018
comment
@RafaelC О! Я этого не знал! Почему это так? И что мне использовать для хранения файла, если не кадр данных? Я нахожу многомерные списки мучительными для работы в Python — это не так интуитивно понятно, как, скажем, в C.   -  person Kristada673    schedule 10.07.2018
comment
Потому что вы постоянно перетасовываете свои данные через порог Python/C, что дорого. Кроме того, .words — довольно сложная операция; .singularize может быть самой быстрой вещью в вашем коде.   -  person Amadan    schedule 10.07.2018
comment
Можете ли вы предоставить пример ввода/вывода? Кроме того, вы делаете data['word'][I] и, вероятно, получаете предупреждение о том, что вы меняете копию, а не свой df ?   -  person rafaelc    schedule 10.07.2018
comment
@RafaelC Да, это предупреждение было выдано! Я отредактировал вопрос, чтобы включить часть ввода и вывода.   -  person Kristada673    schedule 10.07.2018


Ответы (1)


Что насчет этого?

In [1]: import pandas as pd

In [2]: from textblob import Word

In [3]: s = pd.read_csv('text', squeeze=True, memory_map=True)

In [4]: type(s)
Out[4]: pandas.core.series.Series

In [5]: s = s.apply(lambda w: Word(w).singularize())

In [6]: s
Out[6]:
0      development
1       investment
2             fund
3             slow
4          company
5           commit
6              pay
7            claim
8          finance
9         customer
10         claimed
11       insurance
12         comment
13           rapid
14    bureaucratic
15          affair
16          report
17    policyholder
18        detailed
Name: word, dtype: object

Я использую squeeze здесь, чтобы read_csv возвращал серию вместо DataFrame, потому что файл слова имеет только один столбец. Кроме того, memory_map можно использовать, если файл слов большой.

Можете ли вы проверить производительность с вашими данными?

person Community    schedule 12.07.2018