我有一个单词列表(大约1000个单词),我称之为负面单词。
['CAST','ARTICLES','SANITARY','JAN','CLAUSES','SPECIAL','ENDORSEMENT']
我很快就会从这个单词列表中创建一个数据框。
我还有一个看起来像 -
的数据框 FileName PageNo LineNo GOODS_DESC
1 17668620 TM000004 36 CAST ARTICLES IRON SANITARY
59 17668620 TM000014 41 CRATES
60 17668620 TM000014 42 CAST ARTICLES IRON
61 17668620 TM000014 49 JAN ANIMAL AND VEGETABLE
63 17668620 TM000016 49 SETTLING AGENT
65 17668620 TM000016 29 JAN
66 17668620 TM000016 32 CLAUSES SPECIAL CONDITIONS WARRANTIES
67 17668620 TM000016 37 CARGO ISM ENDORSEMENT
69 17668620 TM000017 113 QUANTITY DECLARED IRON CRATES
我想从数据框中删除否定词(尽可能快)。 并获得精炼的数据帧。 所以数据框看起来像这样 - 这个单词列表中的数据框。
我还有一个看起来像 -
的数据框 FileName PageNo LineNo GOODS_DESC
1 17668620 TM000004 36 IRON
59 17668620 TM000014 41 CRATES
60 17668620 TM000014 42 IRON
61 17668620 TM000014 49 ANIMAL AND VEGETABLE
63 17668620 TM000016 49 SETTLING AGENT
65 17668620 TM000016 29 NaN
66 17668620 TM000016 32 CONDITIONS WARRANTIES
67 17668620 TM000016 37 CARGO ISM
69 17668620 TM000017 113 QUANTITY DECLARED IRON CRATES
目前我的方法是我在迭代数据帧,取每一行并拆分它并检查分裂的单词是否在否定单词列表中。如果它不存在那么我正在通过加入创建一个新的字符串单词并将其添加到数据框中。
for rows in df.itertuples():
a = []
flat_list = []
a.append(rows.GOODS_DESC)
flat_list = [item.strip() for sublist in a for item in sublist.split(' ') if item.strip()]
flat_list = list(sorted(set(flat_list), key=flat_list.index))
flat_list = [i for i in flat_list if i.lower() not in negative_words_list]
if(not flat_list):
df.drop(rows.Index,inplace=True)
continue
s=' '.join(flat_list)
df.loc[rows.Index,'GOODS_DESC']=s
df['GOODS_DESC'] = df['GOODS_DESC'].str.upper()
这种方法唯一的问题是它太慢了。
如果你有任何提示,那么逻辑然后分享。有人可以告诉我如何使用pandas数据帧在更短的时间内完成此过程。
答案 0 :(得分:3)
由于pandas中.str访问器的缓慢和循环,使用列表理解可能更好:
import re
l=['CAST','ARTICLES','SANITARY','JAN','CLAUSES','SPECIAL','ENDORSEMENT']
df['GOODS_DESC'] = [re.sub('|'.join(l),'',i).strip() if re.sub('|'.join(l),'',i).strip() != '' else np.nan for i in df.GOODS_DESC]
输出:
FileName PageNo LineNo GOODS_DESC
1 17668620 TM000004 36 IRON
59 17668620 TM000014 41 CRATES
60 17668620 TM000014 42 IRON
61 17668620 TM000014 49 ANIMAL AND VEGETABLE
63 17668620 TM000016 49 SETTLING AGENT
65 17668620 TM000016 29 NaN
66 17668620 TM000016 32 CONDITIONS WARRANTIES
67 17668620 TM000016 37 CARGO ISM
69 17668620 TM000017 113 QUANTITY DECLARED IRON CRATES
%timeit [re.sub('|'。join(l),'',i).strip()if re.sub('|'。join(l),'',i).strip()!=''else np.nan for i in df.GOODS_DESC]
每回路89.6μs±667 ns(平均值±标准偏差,7次运行,每次10000次循环)
使用.str访问者
%timeit df ['GOODS_DESC']。str.replace('|'。join(l),'')。str.strip()
每回路466μs±10.4μs(平均值±标准偏差,7次运行,1000次循环 每个)
答案 1 :(得分:2)
这应该相当快。
import re
neg = ['CAST','ARTICLES','SANITARY','JAN','CLAUSES','SPECIAL','ENDORSEMENT']
pat = re.compile('|'.join(neg))
df['GOODS_DESC'] = [re.sub('\s+', ' ', re.sub(pat, '', s)).strip() for s in df.GOODS_DESC]
df.loc[df.GOODS_DESC=='', 'GOODS_DESC'] = np.nan
答案 2 :(得分:1)
试试这个,
l=['CAST','ARTICLES','SANITARY','JAN','CLAUSES','SPECIAL','ENDORSEMENT']
df['GOODS_DESC']=df['GOODS_DESC'].str.replace('|'.join(l),'').str.strip()
输出:
GOODS_DESC
0 IRON
1 CRATES
2 IRON
3 ANIMAL AND VEGETABLE
4 SETTLING AGENT
5
6 CONDITIONS WARRANTIES
7 CARGO ISM
8 QUANTITY DECLARED IRON CRATES
答案 3 :(得分:0)
尝试使用textblob并找到极性。范围介于0和1之间。如果句子的值小于0.5,请定位这些字符串并替换它们。