Python: как перебирать строки в базе данных, проверять ключевые слова из списка, если есть, добавлять число в новый столбец - PullRequest
0 голосов
/ 03 января 2019

Добрый день и спасибо, что заглянули.Я очень ценю ваше время.

Я пытаюсь перебрать все строки в фрейме данных Pandas, проверить в одном столбце (который содержит строковые данные), есть ли в нем подстрока / ключевое слово, которое соответствует одному изсписок ключевых слов.

Существует 7 списков ключевых слов

Должен быть создан новый столбец с именем списка, если ключевое слово появляется в строке, значение в этом столбце равночтобы быть установленным в 1, если нет, он должен быть установлен в 0.

Я использую последнюю версию ноутбука Jupyter (Anaconda) с Python 3.7.У меня ноутбук Intel Core i5-8250 с оперативной памятью 8 ГБ.Я запускаю код на своем ноутбуке.

У меня есть рабочий код, предоставленный моим другом, но я не понимаю, почему мой оригинальный код не работает (работает, но цикл занимает 1 час 30 минутчерез список)

Dataframe составляет около 250 тыс. строк.Каждый список ключевых слов содержит от 30 до 100 ключевых слов.

Это сработало

def new_data(df, keywords):
cols = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for col in cols:
    start = time.time()
    print('Start processing column', col)
    list_ = []
    for idx, row in df.iterrows():
        text = row['Text Data']
        try:
            if any(word in text for word in get_words(keywords[col])):
                list_.append(1)
            else:
                list_.append(0)
        except Exception as e:
            list_.append(0)  
    df = pd.concat([df, pd.DataFrame(list_, columns=[col])], axis=1)
    end = time.time()
    duration = end-start
    print('Column', col, 'Done!')
    print('Time used: {:.0f}min {:.0f}sec'.format(duration//60, duration%60))
    print('='*40)
return df

new_data = new_data(df, keywords)
display(new_data.head())

Хотя это не (ну, это было частично)

for i in range(len(df.index)): #finds number of rows.
if any(x in str(df.loc[i, 'Text Data']) for x in keywords['a']): #Checks each row if any of keywords match.
    df.loc[i,'a'] = 1
else:
    df.loc[i,'a'] = 0

В первом фрагменте кода для просмотра списка кадров требовалось около 25 секунд, а затем добавлялись списки, помогающие сформировать новый кадр данных.

Во второмДля завершения первого списка потребовалось 1 час 30 минут, в то время как второй список занял 2 часа, а третий не закончился через 6 часов.

Я хотел бы узнать, почему это так.Даже если есть разница в производительности, сумма, если разница во времени слишком велика.

Я прошу прощения, если на вопрос был дан ответ, или объяснение неясно.Это мой первый вопрос по stackoverflow, и я потратил довольно много времени на то, чтобы найти ответы, которые, как мне показалось, совпали, но не совсем ответил, почему.

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