我有一个单词和短语列表,我想用它们来指定创建新数据框时要删除的行。
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 方法
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, :]