Найти строки в столбце данных, содержащие вопросы - PullRequest
0 голосов
/ 27 декабря 2018

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

import pandas as pd
df = pd.read_csv('queries-10k-txt-backup', sep='\t')

Вот пример того, как это выглядит:

        QUERY                           FREQ
0       hindi movies for adults         595
1       are panda dogs real             383
2       asuedraw winning numbers        478
3       sentry replacement keys         608
4       rebuilding nicad battery packs  541

После удаления пустых строк, дубликатов иВ столбце FREQ (для этого не требуется) я написал простую функцию, чтобы проверить столбец QUERY, чтобы увидеть, содержит ли он какие-либо слова, которые ставят строку в вопрос:

df_test = df.drop_duplicates()
df_test = df_test.dropna()
df_test = df_test.drop(['FREQ'], axis = 1)

def questions(row):
    questions_list = 
    ["what","when","where","which","who","whom","whose","why","why don't",
          "how","how far","how long","how many","how much","how old","how come","?"]
    if row['QUERY'] in questions_list:
        return 1
    else:
        return 0

df_test['QUESTIONS'] = df_test.apply(questions, axis=1)

Но как только я проверяю новый фрейм данных, хотя он создает новый столбец, все значения равны 0. Я не уверен, что моя логика неверна в функции, я использовал что-то похожее со столбцами данных, которые содержат только одно слово, и, если оно совпадает, это 'Я выведу 1 или 0. Однако та же самая логика, кажется, не работает, когда столбец содержит фразу / предложение, как этот вариант использования.Любой вклад действительно ценится!

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Если вы хотите проверить точное совпадение любой подстроки из question_list и строки из фрейма данных, вам следует использовать str.contains метод:

questions_list = ["what","when","where","which","who","whom","whose","why",
                  "why don't", "how","how far","how long","how many",
                  "how much","how old","how come","?"]

pattern = "|".join(questions_list)  # generate regex from your list 
df_test['QUESTIONS'] = df_test['QUERY'].str.contains(pattern)

Упрощенный пример:

df = pd.DataFrame({
             'QUERY': ['how do you like it', 'what\'s going on?', 'quick brown fox'], 
             'ID': [0, 1, 2]})

Создайте шаблон:

pattern = '|'.join(['what', 'how'])  
pattern                                                                                                                                                                         
Out: 'what|how'

Используйте его:

df['QUERY'].str.contains(pattern)                                                                                                                                                                  
Out[12]: 
0     True
1     True
2    False
Name: QUERY, dtype: bool

Если вы не знакомы с регулярными выражениями, есть быстрый питон re ссылка.Fot символ '|', пояснение:

A | B, где A и B могут быть произвольными RE, создает регулярное выражение, которое будет соответствовать либо A, либо B. Можно разделить произвольное количество RE.через '|'таким образом

0 голосов
/ 28 декабря 2018

IIUC, вам нужно найти, если первое слово в строке в списке вопросов, если да, возвращает 1, иначе 0. В вашей функции, вместо того, чтобы проверять, находится ли вся строка в списке вопросов, разбейте строку и проверьтеесли первый элемент находится в списке вопросов.

def questions(row):
    questions_list = ["are","what","when","where","which","who","whom","whose","why","why don't","how","how far","how long","how many","how much","how old","how come","?"]
    if row['QUERY'].split()[0] in questions_list:
        return 1
    else:
        return 0

df['QUESTIONS'] = df.apply(questions, axis=1)

Вы получаете

    QUERY                       FREQ    QUESTIONS
0   hindi movies for adults     595     0
1   are panda dogs real         383     1
2   asuedraw winning numbers    478     0
3   sentry replacement keys     608     0
4   rebuilding nicad battery packs  541 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...