Удаление подстроки из всех столбцов данных - PullRequest
0 голосов
/ 29 мая 2018

У меня есть список слов (около 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 dataframe за меньшее время.

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Это должно быть довольно быстро.

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
0 голосов
/ 29 мая 2018

Попробуйте textblob и найдите полярность.Диапазон составляет от 0 до 1. Если значение предложения меньше 0,5, нацельтесь на эту строку и замените их.

0 голосов
/ 29 мая 2018

Из-за медлительности и цикличности аксессора .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 ()! = '' иначе np.nan для i в df.GOODS_DESC]

89,6 мкс ± 667 нс на цикл (среднее ± стандартное отклонение из 7 прогонов, 10000 циклов каждый)

Использование доступа .str

% timeit df ['GOODS_DESC']. Str.replace ('|' .join (l), ''). Str.strip ()

466 мкс ± 10,4 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)

0 голосов
/ 29 мая 2018

попробуйте это,

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
...