Замените строку в кадре данных pandas, если она содержит определенную подстроку - PullRequest
0 голосов
/ 15 января 2019

У меня есть датафрейм, сгенерированный из .csv (я использую Python 3.5). df['category'] содержит только строки. Я хочу проверить этот столбец и, если строка содержит определенную подстроку (не очень интересно, где они находятся в строке, пока они существуют), заменить. Я использую этот скрипт

import pandas as pd

df=pd.read_csv('lastfile.csv')


df.dropna(inplace=True)

g='Drugs'
z='Weapons'
c='Flowers'


df.category = df.category.str.lower().apply(lambda x: g if ('mdma' or 'xanax' or 'kamagra' or 'weed' or 'tabs' or 'lsd' or 'heroin' or 'morphine' or 'hci' or 'cap' or 'mda' or 'hash' or 'kush' or 'wax'or 'klonop'or\
                                                            'dextro'or'zepam'or'amphetamine'or'ketamine'or 'speed' or 'xtc' or 'XTC' or 'SPEED' or 'crystal' or 'meth' or 'marijuana' or 'powder' or 'afghan'or'cocaine'or'haze'or'pollen'or\
                                                            'sativa'or'indica'or'valium'or'diazepam'or'tablet'or'codeine'or \
                                                            'mg' or 'dmt'or'diclazepam'or'zepam'or 'heroin' ) in x else(z if ('weapon'or'milit'or'gun'or'grenades'or'submachine'or'rifle'or'ak47')in x else c) )






print(df['category'])

Моя проблема в том, что некоторые записи, хотя и содержат некоторые из определенных мной подстрок, не заменяются. Это проблема, связанная с регулярным выражением? Заранее спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Создать словарь списка подстрок с ключом для замены строк, зациклить его и соединить все значения списка с помощью | для регулярного выражения OR, поэтому можно проверить столбец с помощью contains и заменить соответствующие строки с loc:

df = pd.DataFrame({'category':['sss mdma df','milit ss aa','aa ss']})

a = ['mdma', 'xanax' , 'kamagra']
b = ['weapon','milit','gun']

g='Drugs'
z='Weapons'

c='Flowers'

d = {g:a, z:b}

df['new_category'] = c

for k, v in d.items():
    pat = '|'.join(v)
    mask = df.category.str.contains(pat, case=False)

    df.loc[mask, 'new_category'] = k

print (df)
      category new_category
0  sss mdma df        Drugs
1  milit ss aa      Weapons
2        aa ss      Flowers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...