Циклический просмотр списка и строки соответствия ключевых слов в pandas кадре данных - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть датафрейм, который выглядит следующим образом. Он имеет 1 столбец с надписью «высказывания». df.utterances содержит строки, значениями которых являются строки из n числовых слов.

  
                             utterances
0                                        okay go ahead.
1                                     Um, let me think.
2     nan that's not very encouraging. If they had a...
3     they wouldn't make you want to do it. nan nan ...
4     Yeah. The problem is though, it just, if we pu...

У меня также есть список определенных c слов. Это называется specific_words. Это выглядит так:

specific_words = ['happy, 'good', 'encouraging', 'joyful']

Я хочу проверить, есть ли какие-либо слова из specific_words в любом из высказываний. По сути, я хочу l oop через каждую строку в df.utterance, а когда я делаю это, l oop - specific_list, чтобы искать совпадения. Если есть совпадение, я хочу иметь логический столбец рядом с df.utterances, который показывает это.

def query_text_by_keyword(df, word_list):
    for word in word_list:
        for utt in df.utterance:
            if word in utt:
                match = True
            else:
                match = False
            return match
    
df['query_match'] = df.apply(query_text_by_keyword, 
                                               axis=1, 
                                               args=(specific_words,))

Он не ломается, а просто возвращает False для каждой строки, когда не должен. Например, первые несколько строк должны выглядеть следующим образом:

 utterances                                                    query_match
    0                                        okay go ahead.       False
    1                                     Um, let me think.       False
    2     nan that's not very encouraging. If they had a...       True
    3     they wouldn't make you want to do it. nan nan ...       False
    4     Yeah. The problem is though, it just, if we pu...       False

Edit

@ furas сделал отличное предложение, чтобы решить начальный вопрос. Тем не менее, я также хотел бы добавить еще один столбец, который содержит конкретные c слова из запроса, который указывает на совпадение. Пример:

 utterances                                                 query_match   word  
    0                                    okay go ahead    False      NaN
    1                                 Um, let me think    False      NaN
    2 nan that's not very encouraging. If they had a..    True   'encouraging'
    3 they wouldn't make you want to do it. nan nan ..    False      NaN
    4 Yeah. The problem is though, it just, if we pu..    False      NaN

1 Ответ

1 голос
/ 11 февраля 2020

Вы можете использовать regex с str.contains(regex)

df['utterances'].str.constains("happy|good|encouraging|joyful")

Вы можете создать это regex с

query = '|'.join(specific_words)

Вы также можете использовать str.lower(), поскольку строки могут иметь символы верхнего регистра.

import pandas as pd

df = pd.DataFrame({
    'utterances':[
        'okay go ahead',
        'Um, let me think.',
        'nan that\'s not very encouraging. If they had a...',
        'they wouldn\'t make you want to do it. nan nan ...',
        'Yeah. The problem is though, it just, if we pu...',
    ]
})

specific_words = ['happy', 'good', 'encouraging', 'joyful']

query = '|'.join(specific_words)

df['query_match'] = df['utterances'].str.lower().str.contains(query)

print(df)

Результат

                                          utterances  query_match
0                                      okay go ahead        False
1                                  Um, let me think.        False
2  nan that's not very encouraging. If they had a...         True
3  they wouldn't make you want to do it. nan nan ...        False
4  Yeah. The problem is though, it just, if we pu...        False

РЕДАКТИРОВАТЬ: , так как @HenryYik упоминается в комментарии, вы можете использовать case=False вместо str.lower()

df['query_match'] = df['utterances'].str.contains(query, case=False)

Больше в деле c: pandas .Series.str.contains


РЕДАКТИРОВАТЬ: чтобы получить соответствующее слово, которое вы можете использовать str.extract() с regex в (...)

df['word'] = df['utterances'].str.extract( "(happy|good|encouraging|joyful)" )

Рабочий пример:

import pandas as pd

df = pd.DataFrame({
    'utterances':[
        'okay go ahead',
        'Um, let me think.',
        'nan that\'s not very encouraging. If they had a...',
        'they wouldn\'t make you want to do it. nan nan ...',
        'Yeah. The problem is though, it just, if we pu...',
        'Yeah. happy good',
    ]
})

specific_words = ['happy', 'good', 'encouraging', 'joyful']

query = '|'.join(specific_words)

df['query_match'] = df['utterances'].str.contains(query, case=False)
df['word'] = df['utterances'].str.extract( '({})'.format(query) )

print(df)

В примере я добавил 'Yeah. happy good', чтобы проверить, какое слово будет возвращается happy или good. Возвращает первое совпадающее слово.

Результат:

                                          utterances  query_match         word
0                                      okay go ahead        False          NaN
1                                  Um, let me think.        False          NaN
2  nan that's not very encouraging. If they had a...         True  encouraging
3  they wouldn't make you want to do it. nan nan ...        False          NaN
4  Yeah. The problem is though, it just, if we pu...        False          NaN
5                                   Yeah. happy good         True        happy

Кстати: теперь вы можете даже

df['query_match'] = ~df['word'].isna()

или

df['query_match'] = df['word'].notna()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...