Python: оператор IF, состоящий из фрейма данных и списка - PullRequest
0 голосов
/ 13 апреля 2020

Я очень новичок в python и мне нужна помощь. У меня есть список ключевых слов, который был получен из фрейма данных следующим образом: key_a_list = df_key_words['words'].tolist()

У меня есть второй фрейм данных, который состоит из утверждений: df_response['statement'] Я уже исправил орфографические ошибки, токенизировал и остановил текст в столбце df_response['statement']. Мне нужно проверить, есть ли в key_a_list слова, совпадающие со словами в df_response['statement']; затем я должен установить счетчик, чтобы подсчитать, сколько раз слово из key_a_list присутствует в df_response['statement'].

Спасибо за ваше время и помощь, это очень ценится :)

Это текущий код, который у меня есть, но он выдает ошибку: ValueError: Длина должна совпадать для сравнения

count_a = 0
def count(x):
    for x in key_a_list:
        if key_a_list == df_response['statement']:
            count_a = count_a + 1      
    return count_a

df_response['statement'] = df_response['statement'].apply(lambda x: " ".join([count(x) for word in x.split()]))

key_a_list состоит из таких слов, как: ['думай', 'колледж', 'образование', 'помогай', 'лучше', 'готовься', 'карьера', 'выбрал', 'в конце концов' , «включить», «войти», «работа», «рынок», «поле», «как», «сделать», «выбор», «социальный», «ориентация», «верить», «дополнительный», « год »,« улучшить »,« компетентность »,« работник »,« доказать »,« способный »,« завершить »,« степень »,« богатый »,« преуспеть »,« почувствовать »,« важно »,« показать » , «умный», «человек», «порядок», «зарплата», «позже», «на», «хочу», «то», «хорошо», «жизнь», «учеба», «старшая школа», « актуарий ',' найти ',' высокая оплата ',' получить ',' престижный ']

df_response [' заявление '] выглядит следующим образом:

                  statement
0                  parent said
1         want make difference
2                    dont know
3                         rich
4               go career want
5                      actuary
6                  social life
7             expected society

, где желаемый результат df_response:

                  statement         count_a
0                  parent said       0
1         want make difference       2
2                    dont know       0
3                         rich       1
4               go career want       2
5                      actuary       1
6                  social life       2
7             expected society       0

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Нет причин определять вашу собственную функцию или использовать apply() здесь. К счастью, у серии pandas есть удобная встроенная функция: series.str.count () . Ознакомление с методами pandas series.str... может сэкономить вам массу работы! Просто используйте символ канала (|) для join вашего списка, чтобы превратить его в шаблон регулярного выражения, затем count it

df['statement'].str.count('|'.join(key_a_list))

0    0
1    2
2    1
3    1
4    2
5    1
6    2
7    0

df['count_a']=df['statement'].str.count('|'.join(key_a_list))

df

    statement               count_a
0   parent said             0
1   want make difference    2
2   dont know               1
3   rich                    1
4   go career want          2
5   actuary                 1
6   social life             2
7   expected society        0
0 голосов
/ 13 апреля 2020

Я думаю, что вы хотите изменить key_a_list в вашем операторе if на "x", так как x содержит каждое слово в key_a_list, через которое проходит l oop. Далее, вы можете использовать ключевое слово «in», чтобы проверить, есть ли x в df_response [«Statement»], и подсчитать, есть ли оно.

Кроме того, вы можете определить count_a внутри функции, чтобы она не была глобальной переменной, чтобы избежать ее сброса при каждом запуске функции count (x) вместо добавления к существующему счетчику.

I думаю, что это должно работать таким образом, пожалуйста, более опытные участники поправьте меня, если я ошибаюсь:

def count(x):
    count_a = 0
    for x in key_a_list:
        if x in df_response['statement']:
            count_a = count_a + 1      
    return count_a
...