过滤 df 以删除列中包含单词/短语的行

问题描述 投票:0回答:1

我有一个单词和短语列表,我想用它们来指定创建新数据框时要删除的行。

include = ['word1', 'word2', 'word3'...] 排除 = ['word4', 'word5 word6' ...]

到目前为止我基本上已经尝试过: 新_df = []

对于包含中的单词: valid = df['Message'].str.contains(word) 计数 = 0 对于有效的项目: 如果项目: temp.append(df.iloc[计数]) 计数 += 1

然后我使用 temp = pd.DataFrame(temp) 和 temp = temp.drop_duplicates 删除多余的内容

这给了我包含的数据框,但我想进一步指定如果它们包含排除的任何单词,则应删除该行。我对 Pandas 不太熟练,并且尝试了相同的概念,只是用 ~ 表示有效,用 .drop() 而不是 .append() 但行仍然保留,我该怎么办?

pandas dataframe contains
1个回答
0
投票

我假设这些单词会嵌入到更大的文本中,如果没有,你应该考虑 Pandas 方法

df['Message'].isin(list_of_words)

对于第一种情况,您可以使用正则表达式模式或不使用正则表达式模式,并使用

reduce
组合所有掩码(布尔值列表)

没有正则表达式模式的示例

import pandas as pd
from operator import or_
from functools import reduce

df = pd.DataFrame(
    {
        'Message': [
            'word1 aaa',
            'word1 word4',
            'word4',
            'word3aaa'
        ]
    }
)

include_words_list = ['word1', 'word2', 'word3']
exclude_words_list = ['word4', 'word5', 'word6']

include_rows_mask = reduce(or_, [df['Message'].str.contains(word, regex=False) for word in include_words_list])
exclude_rows_mask = reduce(or_, [df['Message'].str.contains(word, regex=False) for word in exclude_words_list])

selected_rows_mask = (include_rows_mask) & ~(exclude_rows_mask)

df_selected = df.loc[selected_rows_mask, :]

正则表达式模式示例

import pandas as pd
from operator import or_
from functools import reduce

df = pd.DataFrame(
    {
        'Message': [
            'word1 aaa',
            'word1 word4',
            'word4',
            'word3aaa'
        ]
    }
)

include_words_pattern= '(word1|word2|word3)'
exclude_words_pattern = '(word4|word5|word6)'

include_rows_mask = df['Message'].str.contains(include_words_pattern, regex=True)
exclude_rows_mask = df['Message'].str.contains(exclude_words_pattern, regex=True)

selected_rows_mask = (include_rows_mask) & ~(exclude_rows_mask)

df_selected = df.loc[selected_rows_mask, :]

© www.soinside.com 2019 - 2024. All rights reserved.