从所有数据框列

时间:2018-05-29 12:36:44

标签: python pandas dataframe python-3.6

我有一个单词列表(大约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数据帧在更短的时间内完成此过程。

4 个答案:

答案 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,请定位这些字符串并替换它们。