[英]Finding words from a text document and removing the corresponding rows in dataframe - 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万行的有效方法。
用字符串模式更新了问题而不是直接的单词。 对不起,早先的要求不好。
任何人都可以建议我更好的方法吗?
谢谢
您可以使用apply
方法,通过行检查和创建矢量指示行是否包含在任何bad_words
使用isin
方法,然后子集基于逻辑矢量原始数据帧返回:
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
我改变了你的例子,因为word1
在技术上是在word11
和word12
,我不认为这就是你的意思。
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)
我将使用regex
并contains
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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.