Pandas 在dataframe列中查找包含问题的行

Pandas 在dataframe列中查找包含问题的行,pandas,dataframe,Pandas,Dataframe,我有一个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

我有一个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列(这不需要)之后,我编写了一个简单的函数来检查查询列,以查看它是否包含使字符串成为问题的单词:

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)

但一旦我检查了新的dataframe,即使它创建了新的列,所有的值都是0。我不确定我的逻辑在函数中是否错误,我使用了类似于dataframe列的东西,它只有一个字,如果匹配,它将输出1或0。然而,当该列包含类似于此用例的短语/句子时,相同的逻辑似乎不起作用。非常感谢您的任何意见

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

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

如果您希望检查
问题列表
中的任何子字符串和dataframe中的字符串的精确匹配,应使用以下方法:

简化示例:

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
如果您不熟悉正则表达式,请快速阅读python
re
reference。对于符号
“|”
,说明如下

A | B,其中A和B可以是任意的REs,创建一个与A或B匹配的正则表达式。任意数量的REs可以通过这种方式用“|”分隔


如果您希望检查
问题列表
中的任何子字符串和dataframe中的字符串的精确匹配,应使用以下方法:

简化示例:

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
如果您不熟悉正则表达式,请快速阅读python
re
reference。对于符号
“|”
,说明如下

A | B,其中A和B可以是任意的REs,创建一个与A或B匹配的正则表达式。任意数量的REs可以通过这种方式用“|”分隔


这个问题与机器学习无关-请不要垃圾邮件标签(已删除)。只需检查str。contains@W-B当我尝试这个方法时,我得到了一个“错误:在位置107没有要重复的内容”:df_test['QUESTIONS']=df_test['QUERY'].str.contains(“什么|什么|什么|什么|谁|谁|谁|谁|为什么|为什么|为什么|怎么|多远|多长|多少|多少|多大|怎么来|?”。astype(int)我不使用regex thoughQuestion与机器学习无关-请不要发送垃圾邮件(删除)。只需检查str。contains@W-B我得到一个“错误:在107号位置无需重复“当我尝试这个方法时:df|u test['QUESTIONS']=df|u test['QUERY'].str.contains(“what | when | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | who | | |,或者是否有任何句子结构,第一个单词可以是其他单词,但仍然是一个问题。除此之外,这将是最简单的方法,谢谢@Codingthusiast,有没有问题不是以问题列表中没有的单词开头的?这更多的是一个语言问题,而不是编码问题:)如果你能创建一个详尽的qn列表,这种方法将使它变得非常简单。是的,这就是问题所在,代码显然是有效的,但是创建一个详尽的问题列表是更棘手的,而且更接近NLP问题的思路。现在,我还在问题列表中添加了:elif row['QUERY'].split()[-1]:return 1处理最后一个问号这是一个有趣的方法,我这里唯一的问题是所有问题是否都以这样一个词开头,或者是否有任何句子结构,第一个单词可以是其他单词,但仍然是一个问题。除此之外,这将是最简单的方法,谢谢@Codingthusiast,有没有问题不是以问题列表中没有的单词开头的?这更多的是一个语言问题,而不是编码问题:)如果你能创建一个详尽的qn列表,这种方法将使它变得非常简单。是的,这就是问题所在,代码显然是有效的,但是创建一个详尽的问题列表是更棘手的,而且更接近NLP问题的思路。现在,我还在问题列表中添加了:elif row['QUERY'].split()[-1]:返回1以处理最后一个问号。对于这种方法,我得到了一个“错误:在位置107无需重复”
问题列表中的句子中有一些特殊字符吗?位置107处的字符串包含什么?尝试转义特殊符号,如“\?”、“*”、“how\?”等。对于这种方法,我得到了一个“错误:位置107处无需重复”
问题列表中的句子中有一些特殊字符吗?位置107处的字符串包含什么?尝试转义特殊符号,如“\?”、“*”、“how\?”等。