【问题标题】:Finding words from a text document and removing the corresponding rows in dataframe - python从文本文档中查找单词并删除数据框中的相应行 - python
【发布时间】:2016-12-25 17:20:05
【问题描述】:

我有一个包含 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 万行的有效方法。

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

谁能给我建议一个更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: python string pandas data-cleaning


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 请注意,isin 适用于 DataFrame,因此您不需要使用 applydata[~data.isin(bad_words.words).any(axis=1)] 就足够了。
    • @Psidom 感谢代码。我在问题中留下了一个要求。列中的单词不会只是单词。它将在一个巨大的字符串内。我现在正在更新问题。你能帮我做这件事吗?就像每一行都有很大的字符串,需要检查其中的单词模式并将其删除。
    • @Psidom 你能解释一下你在 str.contains 中写了什么吗?我的数据出现错误
    • @Psidom 我收到错误:('没有重复',你'发生在索引 0')作为错误
    • @Psidom 当我使用任何单词而不是 w + "(?=\D)" 时,我得到了输出。但是当我在那里使用 w 时,我没有什么可重复的。你能帮我找出问题所在吗?
    【解决方案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]
    

    【讨论】:

    • 感谢代码。我在问题中留下了一个要求。列中的单词不会只是单词。它将在一个巨大的字符串内。我现在正在更新问题。你能帮我做这件事吗?就像每一行都有很大的字符串,需要检查其中的单词模式并将其删除。
    • 使用 data.loc[~data.stack().str.contains(regex).unstack().any(1)] 时出现错误:没有可重复的内容,但是当我使用某些东西时像, data.loc[~data.stack().str.contains('word11|word1').unstack().any(1)] 工作正常吗?你能帮我理解为什么会这样吗?
    • 我认为这是您的python版本中的一个错误。 stackoverflow.com/questions/3675144/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多