Pandas 在dataframe列中查找包含问题的行
我有一个TSV文件,我将其加载到pandas数据帧中进行一些预处理,我想找出哪些行中有问题,并在新列中输出1或0。因为它是TSV,所以我是这样加载它的: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
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
如果您不熟悉正则表达式,请快速阅读pythonre
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
如果您不熟悉正则表达式,请快速阅读pythonre
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\?”等。