从文本文档中查找词语并在数据帧中删除相应的行 - python

2024-09-29 19:11:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表有8700万行和5列。我也有一个单独的文件,大约3500字。我想检查.txt文件中的单词,并检查表中每行4列中的单词。如果该单词出现在任何列中,那么我想删除这些行。这将帮助我大大减少这里的行数。下面是我使用的代码

bad_words = pd.read_csv('badwords.txt')

bad_words.dtypes

words    object
dtype: object

bad_words

        words
    0   word1
    1   word3
    2   word5
    3   word13
    4   word16
data

s.no      column1        column2        column3         column4
1         aaaword1b      aaaword2b      aaaword3b       aaaword4b
2         aaaword5b      aaaword6b      aaaword7b       aaaword8b                         
3         aaaword9b      aaaword10b     aaaword11b      aaaword12b
4         aaaword13b     aaaword14b     aaaword15b      aaaword16b
5         aaaword17b     aaaword18b     aaaword19b      aaaword20b

我想从坏单词文档中删除包含单词的行。它的输出应该是

data

s.no      column1        column2        column3         column4                       
3         aaaword9b       aaaword10b    aaaword11b      aaaword12b
5         aaaword17b      aaaword18b    aaaword19b      aaaword20b

我试着做一些事情,比如

data[(data['column1'].str.contains("word1|word3|word5|word13|word16")==False)| 
(data['column2'].str.contains("word1|word3|word5|word13|word16")==False)|
(data['column3'].str.contains("word1|word3|word5|word13|word16")==False)]

但我不确定我们是否能做到这一点,整个3500字。也不确定这是否是8700万行的有效方法。你知道吗

用字符串模式更新了问题,而不是直接的单词。抱歉,前面的要求不好。

有人能给我建议一个更好的方法吗?你知道吗

谢谢


Tags: falsedata单词badwordscolumn1containsstr
2条回答

我修改了你的例子,因为word1从技术上讲是在word11word12中,我不认为这是你的意思。你知道吗

设置

from StringIO import StringIO
import pandas as pd

text_bad_words = """        words
    0   _word1_
    1   _word3_
    2   _word5_
    3   _word13_
    4   _word16_"""

text_data = """s.no      column1        column2        column3         column4
1         aaa_word1_b      aaa_word2_b      aaa_word3_b       aaa_word4_b
2         aaa_word5_b      aaa_word6_b      aaa_word7_b       aaa_word8_b
3         aaa_word9_b      aaa_word10_b     aaa_word11_b      aaa_word12_b
4         aaa_word13_b     aaa_word14_b     aaa_word15_b      aaa_word16_b
5         aaa_word17_b     aaa_word18_b     aaa_word19_b      aaa_word20_b"""

bad_words = pd.read_csv(
    StringIO(text_bad_words), squeeze=True, index_col=0, delim_whitespace=True)
data = pd.read_csv(
    StringIO(text_data), squeeze=True, index_col=0, delim_whitespace=True)

解决方案

我将使用regexcontains

regex = r'|'.join(bad_words)
regex

'_word1_|_word3_|_word5_|_word13_|_word16_'

创建布尔掩码

mask = data.stack().str.contains(regex).unstack().any(1)
mask

s.no
1     True
2     True
3    False
4     True
5    False
dtype: bool

data.loc[~mask]

enter image description here

您可以使用apply方法按行检查,并使用isin方法创建一个向量,指示该行是否包含bad_words中的任何内容,然后根据返回的逻辑向量对原始数据帧进行子集划分:

data[~data.apply(lambda row: row.isin(bad_words.words).any(), axis = 1)]

#s.no   column1 column2 column3 column4
#2  3     word9  word10  word11  word12
#4  5    word17  word18  word19  word20

对于更新的问题,这里有一个选项可能会根据您的实际数据而起作用:

data[~data.apply(lambda row: bad_words.words.apply(lambda w: row.str.contains(w + "(?=\D)").any()).any(), axis = 1)]


# sno      column1     column2     column3     column4
#2  3    aaaword9b  aaaword10b  aaaword11b  aaaword12b
#4  5   aaaword17b  aaaword18b  aaaword19b  aaaword20b

相关问题 更多 >

    热门问题